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

[SIEM] Overview page feedback #56261

Merged
merged 1 commit into from
Jan 29, 2020

Conversation

andrew-goldstein
Copy link
Contributor

[SIEM] Overview page feedback

Implements feedback and fixes to the Overview page

Overview (default theme)

01-overview-default-theme

Overview (dark theme)

02-overview-dark-theme

Highlights

Loading States

  • The Recent timelines and Security news widgets now use the horizontal bar loading indicator

  • The Host events and Network events widgets now use the horizontal bar loading indicator

  • The Host events and Network events Showing n events subtitles are now hidden on initial load

  • The counts in the Host events and Network events Showing n events subtitles are now hidden on initial load

  • We no longer hide some histogram subtitles after initial load, to prevent shifting of content when a user makes a Stack by selection

News Feed Error State

news-feed-error-state

  • Fixed an issue where the Security news header was hidden when an invalid URL is configured

  • Added a space between the word via and the SIEM advanced settings link

  • Removed the capital “N” from "News" in the error message

Misc Visual Changes

  • Fixed text truncation of the Severity column in the Detections page's Signals table

  • Added the “showing” subtitle to the Signals count histogram on the Detections page

  • Increased the Stack by histogram selector and the `View signals | alerts | events' buttons from 8 to 24px

  • Tweaked the border rendering in the Overview Host Events and Network events widget headers

  • Added 8px of spacing between the Overview Host Events and Network events widget accordion headers and their contents

  • Fixed an issue where the Host events and Networ events widgets didn't render in ie11 https://github.com/elastic/siem-team/issues/499

Non-Visual Fixes

  • Removed an incorrect usage of usememo

  • Removed the placeholder client-side username query from x-pack/legacy/plugins/siem/public/components/recent_timelines/index.tsx

  • Updated the query of the Overview Host events widget to filter by "host.name exists"

  • Updated the query of the Overview Network events widget to filter by "source.ip exists or destination.ip : exists"

@andrew-goldstein andrew-goldstein added Team:SIEM v8.0.0 release_note:skip Skip the PR/issue when compiling release notes v7.7.0 v7.6.0 labels Jan 29, 2020
@andrew-goldstein andrew-goldstein self-assigned this Jan 29, 2020
@elasticmachine
Copy link
Contributor

Pinging @elastic/siem (Team:SIEM)

Copy link
Contributor

@FrankHassanabad FrankHassanabad left a comment

Choose a reason for hiding this comment

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

LGTM

@spong
Copy link
Member

spong commented Jan 29, 2020

nit: If you have the necessary data available, may want to use the single line placeholder when querying for timelines to avoid content jumping when there are no favorites. Guess this is a super-nit as this should be a rather unlikely scenario 😅

Copy link
Member

@spong spong left a comment

Choose a reason for hiding this comment

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

Checked out/tested locally, and performed code review. Left a couple nits, but overall looks GREAT to me! Thanks for taking care of all these last-minute requested fixes @andrew-goldstein! 🙂

@andrew-goldstein
Copy link
Contributor Author

Thanks @MichaelMarcialis, @spong, @XavierM, @rylnd @MikePaquette and @dcode for your collaboration on the Overview! 🙏

@andrew-goldstein
Copy link
Contributor Author

andrew-goldstein commented Jan 29, 2020

desk-tested locally in:

  • Chrome 79.0.3945.130
  • Firefox 72.0.2
  • Safari 13.0.4
  • IE11 (all Overview widgets render) 11.973.17763.0

I also desk tested locally with:

  • xpack.security.enabled: false in config/elasticsearch.yml
  • all data indexes dropped, to view the FTUE

@andrew-goldstein andrew-goldstein force-pushed the overview-feedback branch 2 times, most recently from 1c99b92 to c0de715 Compare January 29, 2020 04:29
Implements feedback and fixes to the Overview page

### Overview (default theme)

![01-overview-default-theme](https://user-images.githubusercontent.com/4459398/73315509-899c5500-41ed-11ea-9949-82853dd4ba59.png)

### Overview (dark theme)

![02-overview-dark-theme](https://user-images.githubusercontent.com/4459398/73315527-902acc80-41ed-11ea-9701-6a2c5fa40cce.png)

## Highlights

* The new order of widgets is Signals, Alerts, Events, Host Events, Network events, per elastic/siem-team#494

* Changed the default `External alerts count` `Stack by` to `event.module` elastic/siem-team#491

*  Added `event.module` to the `Events count` histogram elastic/siem-team#491

* Widget titles will no longer include the currently selected `Stack by option`. The widgets will use the same static title text that appears on the other pages (i.e.. `Signals count`, `External alerts count`, and `Events count`) elastic/siem-team#491

* The `Signals count` includes a `Stack by` that defaults to `signal.rule.threat.tatic.name`

* Standardized on a 300px widget height for all histograms in the app (thanks @MichaelMarcialis for paring on this!)

* The `Open as duplicate timeline` action is `Recent timelines` is now only shown when hovering over a recent timeline

## Loading States

* The `Recent timelines` and `Security news` widgets now use the horizontal bar loading indicator

* The `Host events` and `Network events` widgets now use the horizontal bar loading indicator

* The `Host events` and `Network events` Showing _n_ events subtitles are now hidden on initial load

* The counts in the `Host events` and `Network events` Showing _n_ events subtitles are now hidden on initial load

* We no longer hide some histogram subtitles after initial load, to prevent shifting of content when a user makes a `Stack by` selection

## News Feed Error State

![news-feed-error-state](https://user-images.githubusercontent.com/4459398/73316060-1e538280-41ef-11ea-83f5-b8d6e9fa3741.png)

* Fixed an issue where the `Security news` header was hidden when an invalid URL is configured

* Added a space between the word `via` and the `SIEM advanced settings` link

* Removed the capital “N” from "News" in the error message

## Misc Visual Changes

* Fixed text truncation of the `Severity` column in the `Detections` page's `Signals` table

* Added the “showing” subtitle to the `Signals count` histogram on the Detections page

* Increased the `Stack by` histogram selector and the `View signals | alerts | events' buttons from 8 to 24px

* Tweaked the border rendering in the Overview `Host Events` and `Network events` widget headers

* Added 8px of spacing between the Overview `Host Events` and `Network events` widget accordion headers and their contents

* Fixed an issue where the `Host events` and `Networ events` widgets didn't render in ie11 elastic/siem-team#499

## Non-Visual Fixes

* Removed an incorrect usage of `usememo`

* Removed the placeholder client-side username query from `x-pack/legacy/plugins/siem/public/components/recent_timelines/index.tsx`

* Updated the query of the Overview `Host events` widget to filter by "host.name exists"

* Updated the query of the Overview `Network events` widget to filter by "source.ip exists or destination.ip : exists"
@kibanamachine
Copy link
Contributor

💛 Build succeeded, but was flaky


Test Failures

Kibana Pipeline / kibana-xpack-agent / Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job·ts.machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays details for the created job in the job list

Link to Jenkins

Standard Out

Failed Tests Reporter:
  - Test has failed 2 times on tracked branches: https://github.com/elastic/kibana/issues/50010

[00:00:00]       │
[00:13:01]         └-: machine learning
[00:13:01]           └-> "before all" hook
[00:16:03]           └-: anomaly detection
[00:16:03]             └-> "before all" hook
[00:31:37]             └-: advanced job
[00:31:37]               └-> "before all" hook
[00:31:37]               └-> "before all" hook
[00:31:37]                 │ info [ml/ecommerce] Loading "mappings.json"
[00:31:37]                 │ info [ml/ecommerce] Loading "data.json.gz"
[00:31:37]                 │ info [o.e.a.s.m.TransportMasterNodeAction] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] unexpected exception during publication
[00:31:37]                 │      org.elasticsearch.ResourceAlreadyExistsException: index [ecommerce/mHamH2CQTMyLW7_yXqw6Fg] already exists
[00:31:37]                 │      	at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService.validateIndexName(MetaDataCreateIndexService.java:147) ~[elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService.validate(MetaDataCreateIndexService.java:616) ~[elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$IndexCreationTask.execute(MetaDataCreateIndexService.java:291) ~[elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.ClusterStateUpdateTask.execute(ClusterStateUpdateTask.java:47) ~[elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.service.MasterService.executeTasks(MasterService.java:697) ~[elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.service.MasterService.calculateTaskOutputs(MasterService.java:319) ~[elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.service.MasterService.runTasks(MasterService.java:214) [elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.service.MasterService$Batcher.run(MasterService.java:151) [elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.service.TaskBatcher.runIfNotProcessed(TaskBatcher.java:150) [elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.cluster.service.TaskBatcher$BatchedTask.run(TaskBatcher.java:188) [elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:699) [elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:252) [elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:215) [elasticsearch-8.0.0-SNAPSHOT.jar:8.0.0-SNAPSHOT]
[00:31:37]                 │      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
[00:31:37]                 │      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
[00:31:37]                 │      	at java.lang.Thread.run(Thread.java:830) [?:?]
[00:31:37]                 │ info [o.e.c.m.MetaDataDeleteIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ecommerce/mHamH2CQTMyLW7_yXqw6Fg] deleting index
[00:31:37]                 │ info [ml/ecommerce] Deleted existing index "ecommerce"
[00:31:37]                 │ info [o.e.c.m.MetaDataCreateIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ecommerce] creating index, cause [api], templates [], shards [1]/[0], mappings [_doc]
[00:31:37]                 │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[ecommerce][0]]]).
[00:31:37]                 │ info [ml/ecommerce] Created index "ecommerce"
[00:31:37]                 │ debg [ml/ecommerce] "ecommerce" settings {"index":{"number_of_replicas":"0","number_of_shards":"1"}}
[00:31:37]                 │ info [o.e.c.m.MetaDataDeleteIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.kibana_1/7y9Rcd3cRM-fyAR6QkAJ5g] deleting index
[00:31:37]                 │ info [o.e.c.m.MetaDataDeleteIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.kibana_2/1DDmbB0ZStKjz5s49CSp0A] deleting index
[00:31:37]                 │ info [ml/ecommerce] Deleted existing index [".kibana_2",".kibana_1"]
[00:31:37]                 │ info [o.e.c.m.MetaDataCreateIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.kibana_1] creating index, cause [api], templates [], shards [1]/[0], mappings [_doc]
[00:31:37]                 │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[.kibana_1][0]]]).
[00:31:37]                 │ info [ml/ecommerce] Created index ".kibana_1"
[00:31:37]                 │ debg [ml/ecommerce] ".kibana_1" settings {"index":{"auto_expand_replicas":"0-1","number_of_replicas":"0","number_of_shards":"1"}}
[00:31:41]                 │ info Creating index .kibana_2.
[00:31:41]                 │ info [o.e.c.m.MetaDataCreateIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.kibana_2] creating index, cause [api], templates [], shards [1]/[1], mappings [_doc]
[00:31:41]                 │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] updating number_of_replicas to [0] for indices [.kibana_2]
[00:31:41]                 │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[.kibana_2][0]]]).
[00:31:41]                 │ info Migrating .kibana_1 saved objects to .kibana_2
[00:31:41]                 │ debg Migrating saved objects space:default, maps-telemetry:maps-telemetry, config:7.0.0, index-pattern:5193f870-d861-11e9-a311-0fa548c5f953
[00:31:41]                 │ info [o.e.c.m.MetaDataMappingService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.kibana_2/j8dUD2yGSJmpEnOrhKJm2A] update_mapping [_doc]
[00:31:41]                 │ info [o.e.c.m.MetaDataMappingService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.kibana_2/j8dUD2yGSJmpEnOrhKJm2A] update_mapping [_doc]
[00:31:41]                 │ info [o.e.c.m.MetaDataMappingService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.kibana_2/j8dUD2yGSJmpEnOrhKJm2A] update_mapping [_doc]
[00:31:41]                 │ info Pointing alias .kibana to .kibana_2.
[00:31:41]                 │ info Finished in 316ms.
[00:31:41]                 │ debg Creating calendar with id 'wizard-test-calendar'...
[00:31:41]                 │ info [o.e.c.m.MetaDataCreateIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.ml-meta] creating index, cause [auto(bulk api)], templates [.ml-meta], shards [1]/[1], mappings [_doc]
[00:31:41]                 │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] updating number_of_replicas to [0] for indices [.ml-meta]
[00:31:41]                 │ info [o.e.c.m.MetaDataCreateIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.ml-annotations-6] creating index, cause [api], templates [], shards [1]/[1], mappings [_doc]
[00:31:41]                 │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] updating number_of_replicas to [0] for indices [.ml-annotations-6]
[00:31:41]                 │ info [o.e.c.m.MetaDataMappingService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.ml-meta/khl_-RF1QDmVXikudwLc0w] update_mapping [_doc]
[00:31:41]                 │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[.ml-annotations-6][0]]]).
[00:31:41]                 │ debg Waiting up to 30000ms for 'wizard-test-calendar' to be created...
[00:31:41]                 │ info [o.e.x.m.MlInitializationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Created ML annotations index and aliases
[00:35:20]               └-: with categorization detector and default datafeed settings
[00:35:20]                 └-> "before all" hook
[00:35:20]                 └-> job creation loads the job management page
[00:35:20]                   └-> "before each" hook: global before each
[00:35:20]                   │ debg navigating to ml url: http://localhost:6141/app/ml
[00:35:20]                   │ debg Navigate to: http://localhost:6141/app/ml
[00:35:20]                   │ debg ... sleep(700) start
[00:35:20]                   │ debg browser[INFO] http://localhost:6141/app/ml?_t=1580279705535 350 Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'unsafe-eval' 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-P5polb1UreUSOe5V/Pv7tc+yeZuJXiOi/3fqhGsU7BE='), or a nonce ('nonce-...') is required to enable inline execution.
[00:35:20]                   │
[00:35:20]                   │ debg browser[INFO] http://localhost:6141/bundles/app/ml/bootstrap.js 8:19 "^ A single error about an inline script not firing due to content security policy is expected!"
[00:35:21]                   │ debg ... sleep(700) end
[00:35:21]                   │ debg returned from get, calling refresh
[00:35:21]                   │ debg browser[INFO] http://localhost:6141/app/ml?_t=1580279705535 350 Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'unsafe-eval' 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-P5polb1UreUSOe5V/Pv7tc+yeZuJXiOi/3fqhGsU7BE='), or a nonce ('nonce-...') is required to enable inline execution.
[00:35:21]                   │
[00:35:21]                   │ debg browser[INFO] http://localhost:6141/bundles/app/ml/bootstrap.js 8:19 "^ A single error about an inline script not firing due to content security policy is expected!"
[00:35:21]                   │ debg currentUrl = http://localhost:6141/app/ml
[00:35:21]                   │          appUrl = http://localhost:6141/app/ml
[00:35:21]                   │ debg Find.findByCssSelector('[data-test-subj="kibanaChrome"]') with timeout=60000
[00:35:25]                   │ debg browser[INFO] http://localhost:6141/built_assets/dlls/vendors_2.bundle.dll.js 92:138197 "INFO: 2020-01-29T06:35:09Z
[00:35:25]                   │        Adding connection to http://localhost:6141/elasticsearch
[00:35:25]                   │
[00:35:25]                   │      "
[00:35:25]                   │ debg ... sleep(501) start
[00:35:25]                   │ debg ... sleep(501) end
[00:35:25]                   │ debg in navigateTo url = http://localhost:6141/app/ml#/overview?_g=(refreshInterval:(pause:!t,value:0))
[00:35:25]                   │ debg --- retry.try error: URL changed, waiting for it to settle
[00:35:26]                   │ debg ... sleep(501) start
[00:35:26]                   │ debg ... sleep(501) end
[00:35:26]                   │ debg in navigateTo url = http://localhost:6141/app/ml#/overview?_g=(refreshInterval:(pause:!t,value:0))
[00:35:26]                   │ debg TestSubjects.exists(statusPageContainer)
[00:35:26]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="statusPageContainer"]') with timeout=2500
[00:35:29]                   │ debg --- retry.tryForTime error: [data-test-subj="statusPageContainer"] is not displayed
[00:35:29]                   │ debg TestSubjects.click(~mlMainTab & ~anomalyDetection)
[00:35:29]                   │ debg Find.clickByCssSelector('[data-test-subj~="mlMainTab"][data-test-subj~="anomalyDetection"]') with timeout=10000
[00:35:29]                   │ debg Find.findByCssSelector('[data-test-subj~="mlMainTab"][data-test-subj~="anomalyDetection"]') with timeout=10000
[00:35:29]                   │ debg TestSubjects.exists(~mlMainTab & ~anomalyDetection & ~selected)
[00:35:29]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="mlMainTab"][data-test-subj~="anomalyDetection"][data-test-subj~="selected"]') with timeout=120000
[00:35:30]                   │ debg TestSubjects.exists(mlPageJobManagement)
[00:35:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlPageJobManagement"]') with timeout=120000
[00:35:30]                   │ debg TestSubjects.findAll(~mlSubTab)
[00:35:30]                   │ debg Find.allByCssSelector('[data-test-subj~="mlSubTab"]') with timeout=3
[00:35:30]                   │ debg TestSubjects.exists(~mlSubTab&~jobManagement)
[00:35:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="mlSubTab"][data-test-subj~="jobManagement"]') with timeout=1000
[00:35:30]                   │ debg TestSubjects.exists(~mlSubTab&~anomalyExplorer)
[00:35:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="mlSubTab"][data-test-subj~="anomalyExplorer"]') with timeout=1000
[00:35:30]                   │ debg TestSubjects.exists(~mlSubTab&~singleMetricViewer)
[00:35:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="mlSubTab"][data-test-subj~="singleMetricViewer"]') with timeout=1000
[00:35:30]                   │ debg TestSubjects.exists(~mlSubTab&~settings)
[00:35:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="mlSubTab"][data-test-subj~="settings"]') with timeout=1000
[00:35:30]                   │ debg TestSubjects.click(~mlSubTab & ~jobManagement)
[00:35:30]                   │ debg Find.clickByCssSelector('[data-test-subj~="mlSubTab"][data-test-subj~="jobManagement"]') with timeout=10000
[00:35:30]                   │ debg Find.findByCssSelector('[data-test-subj~="mlSubTab"][data-test-subj~="jobManagement"]') with timeout=10000
[00:35:30]                   │ debg TestSubjects.exists(~mlSubTab & ~jobManagement & ~selected)
[00:35:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="mlSubTab"][data-test-subj~="jobManagement"][data-test-subj~="selected"]') with timeout=120000
[00:35:30]                   │ debg TestSubjects.exists(mlPageJobManagement)
[00:35:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlPageJobManagement"]') with timeout=120000
[00:35:30]                   └- ✓ pass  (10.6s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation loads the job management page"
[00:35:30]                 └-> job creation loads the new job source selection page
[00:35:30]                   └-> "before each" hook: global before each
[00:35:30]                   │ debg TestSubjects.clickWhenNotDisabled(mlCreateNewJobButton)
[00:35:30]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlCreateNewJobButton"]') with timeout=10000
[00:35:30]                   │ debg Find.findByCssSelector('[data-test-subj="mlCreateNewJobButton"]') with timeout=10000
[00:35:30]                   │ debg TestSubjects.exists(mlPageSourceSelection)
[00:35:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlPageSourceSelection"]') with timeout=120000
[00:35:31]                   └- ✓ pass  (330ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation loads the new job source selection page"
[00:35:31]                 └-> job creation loads the job type selection page
[00:35:31]                   └-> "before each" hook: global before each
[00:35:31]                   │ debg TestSubjects.setValue(savedObjectFinderSearchInput, ecommerce)
[00:35:31]                   │ debg TestSubjects.click(savedObjectFinderSearchInput)
[00:35:31]                   │ debg Find.clickByCssSelector('[data-test-subj="savedObjectFinderSearchInput"]') with timeout=10000
[00:35:31]                   │ debg Find.findByCssSelector('[data-test-subj="savedObjectFinderSearchInput"]') with timeout=10000
[00:35:31]                   │ debg TestSubjects.exists(savedObjectTitleecommerce)
[00:35:31]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="savedObjectTitleecommerce"]') with timeout=120000
[00:35:31]                   │ debg TestSubjects.clickWhenNotDisabled(savedObjectTitleecommerce)
[00:35:31]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="savedObjectTitleecommerce"]') with timeout=10000
[00:35:31]                   │ debg Find.findByCssSelector('[data-test-subj="savedObjectTitleecommerce"]') with timeout=10000
[00:35:31]                   │ debg TestSubjects.exists(mlPageJobTypeSelection)
[00:35:31]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlPageJobTypeSelection"]') with timeout=10000
[00:35:32]                   └- ✓ pass  (1.0s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation loads the job type selection page"
[00:35:32]                 └-> job creation loads the advanced job wizard page
[00:35:32]                   └-> "before each" hook: global before each
[00:35:32]                   │ debg TestSubjects.clickWhenNotDisabled(mlJobTypeLinkAdvancedJob)
[00:35:32]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlJobTypeLinkAdvancedJob"]') with timeout=10000
[00:35:32]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobTypeLinkAdvancedJob"]') with timeout=10000
[00:35:32]                   │ debg TestSubjects.exists(mlPageJobWizard advanced)
[00:35:32]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlPageJobWizard advanced"]') with timeout=120000
[00:35:32]                   └- ✓ pass  (579ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation loads the advanced job wizard page"
[00:35:32]                 └-> job creation displays the configure datafeed step
[00:35:32]                   └-> "before each" hook: global before each
[00:35:32]                   │ debg TestSubjects.exists(mlJobWizardStepTitleConfigureDatafeed)
[00:35:32]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardStepTitleConfigureDatafeed"]') with timeout=120000
[00:35:32]                   └- ✓ pass  (39ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays the configure datafeed step"
[00:35:32]                 └-> job creation pre-fills the datafeed query editor
[00:35:32]                   └-> "before each" hook: global before each
[00:35:32]                   │ debg TestSubjects.exists(mlAdvancedDatafeedQueryEditor > codeEditorContainer)
[00:35:32]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedDatafeedQueryEditor"] [data-test-subj="codeEditorContainer"]') with timeout=120000
[00:35:32]                   │ debg TestSubjects.find(mlAdvancedDatafeedQueryEditor > codeEditorContainer)
[00:35:32]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedDatafeedQueryEditor"] [data-test-subj="codeEditorContainer"]') with timeout=10000
[00:35:33]                   └- ✓ pass  (292ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation pre-fills the datafeed query editor"
[00:35:33]                 └-> job creation inputs the query delay
[00:35:33]                   └-> "before each" hook: global before each
[00:35:33]                   │ debg TestSubjects.exists(mlJobWizardInputQueryDelay)
[00:35:33]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardInputQueryDelay"]') with timeout=120000
[00:35:33]                   │ debg TestSubjects.getAttribute(mlJobWizardInputQueryDelay, value)
[00:35:33]                   │ debg TestSubjects.find(mlJobWizardInputQueryDelay)
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputQueryDelay"]') with timeout=10000
[00:35:33]                   │ debg TestSubjects.getAttribute(mlJobWizardInputQueryDelay, placeholder)
[00:35:33]                   │ debg TestSubjects.find(mlJobWizardInputQueryDelay)
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputQueryDelay"]') with timeout=10000
[00:35:33]                   └- ✓ pass  (75ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs the query delay"
[00:35:33]                 └-> job creation inputs the frequency
[00:35:33]                   └-> "before each" hook: global before each
[00:35:33]                   │ debg TestSubjects.exists(mlJobWizardInputFrequency)
[00:35:33]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardInputFrequency"]') with timeout=120000
[00:35:33]                   │ debg TestSubjects.getAttribute(mlJobWizardInputFrequency, value)
[00:35:33]                   │ debg TestSubjects.find(mlJobWizardInputFrequency)
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputFrequency"]') with timeout=10000
[00:35:33]                   │ debg TestSubjects.getAttribute(mlJobWizardInputFrequency, placeholder)
[00:35:33]                   │ debg TestSubjects.find(mlJobWizardInputFrequency)
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputFrequency"]') with timeout=10000
[00:35:33]                   └- ✓ pass  (77ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs the frequency"
[00:35:33]                 └-> job creation inputs the scroll size
[00:35:33]                   └-> "before each" hook: global before each
[00:35:33]                   │ debg TestSubjects.exists(mlJobWizardInputScrollSize)
[00:35:33]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardInputScrollSize"]') with timeout=120000
[00:35:33]                   │ debg TestSubjects.getAttribute(mlJobWizardInputScrollSize, value)
[00:35:33]                   │ debg TestSubjects.find(mlJobWizardInputScrollSize)
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputScrollSize"]') with timeout=10000
[00:35:33]                   │ debg TestSubjects.getAttribute(mlJobWizardInputScrollSize, placeholder)
[00:35:33]                   │ debg TestSubjects.find(mlJobWizardInputScrollSize)
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputScrollSize"]') with timeout=10000
[00:35:33]                   └- ✓ pass  (75ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs the scroll size"
[00:35:33]                 └-> job creation pre-fills the time field
[00:35:33]                   └-> "before each" hook: global before each
[00:35:33]                   │ debg TestSubjects.exists(mlTimeFieldNameSelect > comboBoxInput)
[00:35:33]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlTimeFieldNameSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:33]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlTimeFieldNameSelect > comboBoxInput
[00:35:33]                   │ debg TestSubjects.find(mlTimeFieldNameSelect > comboBoxInput)
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlTimeFieldNameSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:33]                   └- ✓ pass  (55ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation pre-fills the time field"
[00:35:33]                 └-> job creation displays the pick fields step
[00:35:33]                   └-> "before each" hook: global before each
[00:35:33]                   │ debg TestSubjects.exists(mlJobWizardNavButtonNext)
[00:35:33]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=120000
[00:35:33]                   │ debg TestSubjects.clickWhenNotDisabled(mlJobWizardNavButtonNext)
[00:35:33]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=10000
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=10000
[00:35:33]                   │ debg TestSubjects.exists(mlJobWizardStepTitlePickFields)
[00:35:33]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardStepTitlePickFields"]') with timeout=120000
[00:35:33]                   └- ✓ pass  (306ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays the pick fields step"
[00:35:33]                 └-> job creation selects the categorization field
[00:35:33]                   └-> "before each" hook: global before each
[00:35:33]                   │ debg TestSubjects.exists(mlCategorizationFieldNameSelect > comboBoxInput)
[00:35:33]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlCategorizationFieldNameSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:33]                   │ debg comboBox.set, comboBoxSelector: mlCategorizationFieldNameSelect > comboBoxInput
[00:35:33]                   │ debg TestSubjects.find(mlCategorizationFieldNameSelect > comboBoxInput)
[00:35:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlCategorizationFieldNameSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:33]                   │ debg comboBox.setElement, value: products.product_name
[00:35:33]                   │ debg comboBox.isOptionSelected, value: products.product_name
[00:35:36]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:35:36]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:35:36]                   │ debg Find.allByCssSelector('.euiFilterSelectItem[title^="products.product_name"]') with timeout=2500
[00:35:36]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:35:36]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:35:39]                   │ debg --- retry.tryForTime error: [data-test-subj~="comboBoxOptionsList"] is not displayed
[00:35:39]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlCategorizationFieldNameSelect > comboBoxInput
[00:35:39]                   │ debg TestSubjects.find(mlCategorizationFieldNameSelect > comboBoxInput)
[00:35:39]                   │ debg Find.findByCssSelector('[data-test-subj="mlCategorizationFieldNameSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:39]                   └- ✓ pass  (6.0s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation selects the categorization field"
[00:35:39]                 └-> job creation selects the summary count field
[00:35:39]                   └-> "before each" hook: global before each
[00:35:39]                   │ debg TestSubjects.exists(mlSummaryCountFieldNameSelect > comboBoxInput)
[00:35:39]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlSummaryCountFieldNameSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:39]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlSummaryCountFieldNameSelect > comboBoxInput
[00:35:39]                   │ debg TestSubjects.find(mlSummaryCountFieldNameSelect > comboBoxInput)
[00:35:39]                   │ debg Find.findByCssSelector('[data-test-subj="mlSummaryCountFieldNameSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:39]                   └- ✓ pass  (62ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation selects the summary count field"
[00:35:39]                 └-> job creation adds detectors
[00:35:39]                   └-> "before each" hook: global before each
[00:35:39]                   │ debg TestSubjects.click(mlAddDetectorButton)
[00:35:39]                   │ debg Find.clickByCssSelector('[data-test-subj="mlAddDetectorButton"]') with timeout=10000
[00:35:39]                   │ debg Find.findByCssSelector('[data-test-subj="mlAddDetectorButton"]') with timeout=10000
[00:35:39]                   │ debg TestSubjects.exists(mlCreateDetectorModal)
[00:35:39]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlCreateDetectorModal"]') with timeout=5000
[00:35:39]                   │ debg TestSubjects.exists(mlAdvancedFunctionSelect > comboBoxInput)
[00:35:39]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedFunctionSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:40]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlAdvancedFunctionSelect > comboBoxInput
[00:35:40]                   │ debg TestSubjects.find(mlAdvancedFunctionSelect > comboBoxInput)
[00:35:40]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedFunctionSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:40]                   │ debg TestSubjects.exists(mlAdvancedFieldSelect > comboBoxInput)
[00:35:40]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:40]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlAdvancedFieldSelect > comboBoxInput
[00:35:40]                   │ debg TestSubjects.find(mlAdvancedFieldSelect > comboBoxInput)
[00:35:40]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:40]                   │ debg TestSubjects.exists(mlAdvancedByFieldSelect > comboBoxInput)
[00:35:40]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedByFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:40]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlAdvancedByFieldSelect > comboBoxInput
[00:35:40]                   │ debg TestSubjects.find(mlAdvancedByFieldSelect > comboBoxInput)
[00:35:40]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedByFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:40]                   │ debg TestSubjects.exists(mlAdvancedOverFieldSelect > comboBoxInput)
[00:35:40]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedOverFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:40]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlAdvancedOverFieldSelect > comboBoxInput
[00:35:40]                   │ debg TestSubjects.find(mlAdvancedOverFieldSelect > comboBoxInput)
[00:35:40]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedOverFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:40]                   │ debg TestSubjects.exists(mlAdvancedPartitionFieldSelect > comboBoxInput)
[00:35:40]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedPartitionFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:40]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlAdvancedPartitionFieldSelect > comboBoxInput
[00:35:40]                   │ debg TestSubjects.find(mlAdvancedPartitionFieldSelect > comboBoxInput)
[00:35:40]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedPartitionFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:40]                   │ debg TestSubjects.exists(mlAdvancedExcludeFrequentSelect > comboBoxInput)
[00:35:40]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedExcludeFrequentSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:40]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlAdvancedExcludeFrequentSelect > comboBoxInput
[00:35:40]                   │ debg TestSubjects.find(mlAdvancedExcludeFrequentSelect > comboBoxInput)
[00:35:40]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedExcludeFrequentSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:40]                   │ debg TestSubjects.exists(mlAdvancedDetectorDescriptionInput)
[00:35:40]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedDetectorDescriptionInput"]') with timeout=120000
[00:35:40]                   │ debg TestSubjects.getAttribute(mlAdvancedDetectorDescriptionInput, value)
[00:35:40]                   │ debg TestSubjects.find(mlAdvancedDetectorDescriptionInput)
[00:35:40]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedDetectorDescriptionInput"]') with timeout=10000
[00:35:40]                   │ debg comboBox.set, comboBoxSelector: mlAdvancedFunctionSelect > comboBoxInput
[00:35:40]                   │ debg TestSubjects.find(mlAdvancedFunctionSelect > comboBoxInput)
[00:35:40]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedFunctionSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:40]                   │ debg comboBox.setElement, value: count
[00:35:40]                   │ debg comboBox.isOptionSelected, value: count
[00:35:42]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:35:42]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:35:42]                   │ debg Find.allByCssSelector('.euiFilterSelectItem[title^="count"]') with timeout=2500
[00:35:43]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:35:43]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:35:45]                   │ debg --- retry.tryForTime error: [data-test-subj~="comboBoxOptionsList"] is not displayed
[00:35:46]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlAdvancedFunctionSelect > comboBoxInput
[00:35:46]                   │ debg TestSubjects.find(mlAdvancedFunctionSelect > comboBoxInput)
[00:35:46]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedFunctionSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:46]                   │ debg comboBox.set, comboBoxSelector: mlAdvancedByFieldSelect > comboBoxInput
[00:35:46]                   │ debg TestSubjects.find(mlAdvancedByFieldSelect > comboBoxInput)
[00:35:46]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedByFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:46]                   │ debg comboBox.setElement, value: mlcategory
[00:35:46]                   │ debg comboBox.isOptionSelected, value: mlcategory
[00:35:48]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:35:48]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:35:48]                   │ debg Find.allByCssSelector('.euiFilterSelectItem[title^="mlcategory"]') with timeout=2500
[00:35:48]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:35:48]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:35:51]                   │ debg --- retry.tryForTime error: [data-test-subj~="comboBoxOptionsList"] is not displayed
[00:35:51]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlAdvancedByFieldSelect > comboBoxInput
[00:35:51]                   │ debg TestSubjects.find(mlAdvancedByFieldSelect > comboBoxInput)
[00:35:51]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedByFieldSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:51]                   │ debg TestSubjects.clickWhenNotDisabled(mlCreateDetectorModalSaveButton)
[00:35:51]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlCreateDetectorModalSaveButton"]') with timeout=10000
[00:35:51]                   │ debg Find.findByCssSelector('[data-test-subj="mlCreateDetectorModalSaveButton"]') with timeout=10000
[00:35:51]                   │ debg TestSubjects.missingOrFail(mlCreateDetectorModal)
[00:35:51]                   │ debg Find.waitForDeletedByCssSelector('[data-test-subj="mlCreateDetectorModal"]') with timeout=2500
[00:35:52]                   └- ✓ pass  (12.8s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation adds detectors"
[00:35:52]                 └-> job creation displays detector entries
[00:35:52]                   └-> "before each" hook: global before each
[00:35:52]                   │ debg TestSubjects.exists(mlAdvancedDetector 0)
[00:35:52]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlAdvancedDetector 0"]') with timeout=120000
[00:35:52]                   │ debg TestSubjects.getVisibleText(mlAdvancedDetector 0 > mlDetectorIdentifier)
[00:35:52]                   │ debg TestSubjects.find(mlAdvancedDetector 0 > mlDetectorIdentifier)
[00:35:52]                   │ debg Find.findByCssSelector('[data-test-subj="mlAdvancedDetector 0"] [data-test-subj="mlDetectorIdentifier"]') with timeout=10000
[00:35:52]                   └- ✓ pass  (72ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays detector entries"
[00:35:52]                 └-> job creation inputs the bucket span
[00:35:52]                   └-> "before each" hook: global before each
[00:35:52]                   │ debg TestSubjects.exists(mlJobWizardInputBucketSpan)
[00:35:52]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardInputBucketSpan"]') with timeout=120000
[00:35:52]                   │ debg TestSubjects.setValueWithChecks(mlJobWizardInputBucketSpan, 4h)
[00:35:52]                   │ debg TestSubjects.click(mlJobWizardInputBucketSpan)
[00:35:52]                   │ debg Find.clickByCssSelector('[data-test-subj="mlJobWizardInputBucketSpan"]') with timeout=10000
[00:35:52]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputBucketSpan"]') with timeout=10000
[00:35:53]                   │ debg TestSubjects.getAttribute(mlJobWizardInputBucketSpan, value)
[00:35:53]                   │ debg TestSubjects.find(mlJobWizardInputBucketSpan)
[00:35:53]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputBucketSpan"]') with timeout=10000
[00:35:53]                   └- ✓ pass  (544ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs the bucket span"
[00:35:53]                 └-> job creation inputs influencers
[00:35:53]                   └-> "before each" hook: global before each
[00:35:53]                   │ debg TestSubjects.exists(mlInfluencerSelect > comboBoxInput)
[00:35:53]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlInfluencerSelect"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:35:53]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlInfluencerSelect > comboBoxInput
[00:35:53]                   │ debg TestSubjects.find(mlInfluencerSelect > comboBoxInput)
[00:35:53]                   │ debg Find.findByCssSelector('[data-test-subj="mlInfluencerSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:53]                   │ debg comboBox.set, comboBoxSelector: mlInfluencerSelect > comboBoxInput
[00:35:53]                   │ debg TestSubjects.find(mlInfluencerSelect > comboBoxInput)
[00:35:53]                   │ debg Find.findByCssSelector('[data-test-subj="mlInfluencerSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:53]                   │ debg comboBox.setElement, value: mlcategory
[00:35:53]                   │ debg comboBox.isOptionSelected, value: mlcategory
[00:35:55]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:35:55]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:35:55]                   │ debg Find.allByCssSelector('.euiFilterSelectItem[title^="mlcategory"]') with timeout=2500
[00:35:55]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:35:55]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:35:55]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlInfluencerSelect > comboBoxInput
[00:35:55]                   │ debg TestSubjects.find(mlInfluencerSelect > comboBoxInput)
[00:35:55]                   │ debg Find.findByCssSelector('[data-test-subj="mlInfluencerSelect"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:35:55]                   └- ✓ pass  (2.8s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs influencers"
[00:35:55]                 └-> job creation inputs the model memory limit
[00:35:55]                   └-> "before each" hook: global before each
[00:35:55]                   │ debg TestSubjects.exists(mlJobWizardInputModelMemoryLimit)
[00:35:55]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardInputModelMemoryLimit"]') with timeout=120000
[00:35:55]                   │ debg TestSubjects.setValueWithChecks(mlJobWizardInputModelMemoryLimit, 100mb)
[00:35:55]                   │ debg TestSubjects.click(mlJobWizardInputModelMemoryLimit)
[00:35:55]                   │ debg Find.clickByCssSelector('[data-test-subj="mlJobWizardInputModelMemoryLimit"]') with timeout=10000
[00:35:55]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputModelMemoryLimit"]') with timeout=10000
[00:35:56]                   │ debg TestSubjects.getAttribute(mlJobWizardInputModelMemoryLimit, value)
[00:35:56]                   │ debg TestSubjects.find(mlJobWizardInputModelMemoryLimit)
[00:35:56]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputModelMemoryLimit"]') with timeout=10000
[00:35:56]                   └- ✓ pass  (466ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs the model memory limit"
[00:35:56]                 └-> job creation displays the job details step
[00:35:56]                   └-> "before each" hook: global before each
[00:35:56]                   │ debg TestSubjects.exists(mlJobWizardNavButtonNext)
[00:35:56]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=120000
[00:35:56]                   │ debg TestSubjects.clickWhenNotDisabled(mlJobWizardNavButtonNext)
[00:35:56]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=10000
[00:35:56]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=10000
[00:35:56]                   │ debg TestSubjects.exists(mlJobWizardStepTitleJobDetails)
[00:35:56]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardStepTitleJobDetails"]') with timeout=120000
[00:35:57]                   └- ✓ pass  (733ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays the job details step"
[00:35:57]                 └-> job creation inputs the job id
[00:35:57]                   └-> "before each" hook: global before each
[00:35:57]                   │ debg TestSubjects.exists(mlJobWizardInputJobId)
[00:35:57]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardInputJobId"]') with timeout=120000
[00:35:57]                   │ debg TestSubjects.setValueWithChecks(mlJobWizardInputJobId, ec_advanced_2_1580277582964)
[00:35:57]                   │ debg TestSubjects.click(mlJobWizardInputJobId)
[00:35:57]                   │ debg Find.clickByCssSelector('[data-test-subj="mlJobWizardInputJobId"]') with timeout=10000
[00:35:57]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputJobId"]') with timeout=10000
[00:35:58]                   │ debg TestSubjects.getAttribute(mlJobWizardInputJobId, value)
[00:35:58]                   │ debg TestSubjects.find(mlJobWizardInputJobId)
[00:35:58]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputJobId"]') with timeout=10000
[00:35:58]                   └- ✓ pass  (1.6s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs the job id"
[00:35:58]                 └-> job creation inputs the job description
[00:35:58]                   └-> "before each" hook: global before each
[00:35:58]                   │ debg TestSubjects.exists(mlJobWizardInputJobDescription)
[00:35:58]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardInputJobDescription"]') with timeout=120000
[00:35:58]                   │ debg TestSubjects.setValueWithChecks(mlJobWizardInputJobDescription, Create advanced job from ecommerce dataset with a categorization detector and default datafeed settings)
[00:35:58]                   │ debg TestSubjects.click(mlJobWizardInputJobDescription)
[00:35:58]                   │ debg Find.clickByCssSelector('[data-test-subj="mlJobWizardInputJobDescription"]') with timeout=10000
[00:35:58]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputJobDescription"]') with timeout=10000
[00:36:03]                   │ debg TestSubjects.getVisibleText(mlJobWizardInputJobDescription)
[00:36:03]                   │ debg TestSubjects.find(mlJobWizardInputJobDescription)
[00:36:03]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardInputJobDescription"]') with timeout=10000
[00:36:03]                   └- ✓ pass  (4.7s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs the job description"
[00:36:03]                 └-> job creation inputs job groups
[00:36:03]                   └-> "before each" hook: global before each
[00:36:03]                   │ debg TestSubjects.exists(mlJobWizardComboBoxJobGroups > comboBoxInput)
[00:36:03]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardComboBoxJobGroups"] [data-test-subj="comboBoxInput"]') with timeout=120000
[00:36:03]                   │ debg comboBox.setCustom, comboBoxSelector: mlJobWizardComboBoxJobGroups > comboBoxInput, value: automated
[00:36:03]                   │ debg TestSubjects.find(mlJobWizardComboBoxJobGroups > comboBoxInput)
[00:36:03]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxJobGroups"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:05]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:36:05]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:36:05]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlJobWizardComboBoxJobGroups > comboBoxInput
[00:36:05]                   │ debg TestSubjects.find(mlJobWizardComboBoxJobGroups > comboBoxInput)
[00:36:05]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxJobGroups"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:05]                   │ debg comboBox.setCustom, comboBoxSelector: mlJobWizardComboBoxJobGroups > comboBoxInput, value: ecommerce
[00:36:05]                   │ debg TestSubjects.find(mlJobWizardComboBoxJobGroups > comboBoxInput)
[00:36:05]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxJobGroups"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:08]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:36:08]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:36:08]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlJobWizardComboBoxJobGroups > comboBoxInput
[00:36:08]                   │ debg TestSubjects.find(mlJobWizardComboBoxJobGroups > comboBoxInput)
[00:36:08]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxJobGroups"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:08]                   │ debg comboBox.setCustom, comboBoxSelector: mlJobWizardComboBoxJobGroups > comboBoxInput, value: advanced
[00:36:08]                   │ debg TestSubjects.find(mlJobWizardComboBoxJobGroups > comboBoxInput)
[00:36:08]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxJobGroups"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:10]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:36:10]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:36:10]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlJobWizardComboBoxJobGroups > comboBoxInput
[00:36:10]                   │ debg TestSubjects.find(mlJobWizardComboBoxJobGroups > comboBoxInput)
[00:36:10]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxJobGroups"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:10]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlJobWizardComboBoxJobGroups > comboBoxInput
[00:36:10]                   │ debg TestSubjects.find(mlJobWizardComboBoxJobGroups > comboBoxInput)
[00:36:10]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxJobGroups"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:10]                   └- ✓ pass  (7.4s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation inputs job groups"
[00:36:10]                 └-> job creation opens the additional settings section
[00:36:10]                   └-> "before each" hook: global before each
[00:36:10]                   │ debg TestSubjects.exists(mlJobWizardAdditionalSettingsSection)
[00:36:10]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardAdditionalSettingsSection"]') with timeout=2500
[00:36:10]                   │ debg --- retry.tryForTime error: [data-test-subj="mlJobWizardAdditionalSettingsSection"] is not displayed
[00:36:11]                   │ debg --- retry.tryForTime failed again with the same message...
[00:36:11]                   │ debg --- retry.tryForTime failed again with the same message...
[00:36:12]                   │ debg --- retry.tryForTime failed again with the same message...
[00:36:12]                   │ debg --- retry.tryForTime failed again with the same message...
[00:36:13]                   │ debg TestSubjects.click(mlJobWizardToggleAdditionalSettingsSection)
[00:36:13]                   │ debg Find.clickByCssSelector('[data-test-subj="mlJobWizardToggleAdditionalSettingsSection"]') with timeout=10000
[00:36:13]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardToggleAdditionalSettingsSection"]') with timeout=10000
[00:36:13]                   │ debg TestSubjects.exists(mlJobWizardAdditionalSettingsSection)
[00:36:13]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardAdditionalSettingsSection"]') with timeout=1000
[00:36:13]                   └- ✓ pass  (2.8s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation opens the additional settings section"
[00:36:13]                 └-> job creation adds a new custom url
[00:36:13]                   └-> "before each" hook: global before each
[00:36:13]                   │ debg TestSubjects.exists(mlJobWizardAdditionalSettingsSection)
[00:36:13]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardAdditionalSettingsSection"]') with timeout=2500
[00:36:13]                   │ debg TestSubjects.findAll(mlJobEditCustomUrlsList > *)
[00:36:13]                   │ debg Find.allByCssSelector('[data-test-subj="mlJobEditCustomUrlsList"] [data-test-subj="*"]') with timeout=10000
[00:36:23]                   │ debg TestSubjects.exists(mlJobNewCustomUrlFormModal)
[00:36:23]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobNewCustomUrlFormModal"]') with timeout=2500
[00:36:26]                   │ debg --- retry.tryForTime error: [data-test-subj="mlJobNewCustomUrlFormModal"] is not displayed
[00:36:26]                   │ debg TestSubjects.click(mlJobOpenCustomUrlFormButton)
[00:36:26]                   │ debg Find.clickByCssSelector('[data-test-subj="mlJobOpenCustomUrlFormButton"]') with timeout=10000
[00:36:26]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobOpenCustomUrlFormButton"]') with timeout=10000
[00:36:26]                   │ debg TestSubjects.exists(mlJobNewCustomUrlFormModal)
[00:36:26]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobNewCustomUrlFormModal"]') with timeout=1000
[00:36:26]                   │ debg TestSubjects.setValue(mlJobCustomUrlLabelInput, check-kibana-dashboard)
[00:36:26]                   │ debg TestSubjects.click(mlJobCustomUrlLabelInput)
[00:36:26]                   │ debg Find.clickByCssSelector('[data-test-subj="mlJobCustomUrlLabelInput"]') with timeout=10000
[00:36:26]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobCustomUrlLabelInput"]') with timeout=10000
[00:36:27]                   │ debg TestSubjects.getAttribute(mlJobCustomUrlLabelInput, value)
[00:36:27]                   │ debg TestSubjects.find(mlJobCustomUrlLabelInput)
[00:36:27]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobCustomUrlLabelInput"]') with timeout=10000
[00:36:27]                   │ debg TestSubjects.click(mlJobAddCustomUrl)
[00:36:27]                   │ debg Find.clickByCssSelector('[data-test-subj="mlJobAddCustomUrl"]') with timeout=10000
[00:36:27]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobAddCustomUrl"]') with timeout=10000
[00:36:27]                   │ debg TestSubjects.missingOrFail(mlJobNewCustomUrlFormModal)
[00:36:27]                   │ debg Find.waitForDeletedByCssSelector('[data-test-subj="mlJobNewCustomUrlFormModal"]') with timeout=10000
[00:36:28]                   │ debg TestSubjects.exists(mlJobEditCustomUrlItem_0)
[00:36:28]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobEditCustomUrlItem_0"]') with timeout=120000
[00:36:28]                   │ debg TestSubjects.getAttribute(mlJobEditCustomUrlLabelInput_0, value)
[00:36:28]                   │ debg TestSubjects.find(mlJobEditCustomUrlLabelInput_0)
[00:36:28]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobEditCustomUrlLabelInput_0"]') with timeout=10000
[00:36:28]                   └- ✓ pass  (14.6s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation adds a new custom url"
[00:36:28]                 └-> job creation assigns calendars
[00:36:28]                   └-> "before each" hook: global before each
[00:36:28]                   │ debg TestSubjects.exists(mlJobWizardAdditionalSettingsSection)
[00:36:28]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardAdditionalSettingsSection"]') with timeout=2500
[00:36:28]                   │ debg comboBox.setCustom, comboBoxSelector: mlJobWizardComboBoxCalendars > comboBoxInput, value: wizard-test-calendar
[00:36:28]                   │ debg TestSubjects.find(mlJobWizardComboBoxCalendars > comboBoxInput)
[00:36:28]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxCalendars"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:30]                   │ debg TestSubjects.exists(~comboBoxOptionsList)
[00:36:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="comboBoxOptionsList"]') with timeout=2500
[00:36:30]                   │ debg TestSubjects.exists(mlJobWizardAdditionalSettingsSection)
[00:36:30]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardAdditionalSettingsSection"]') with timeout=2500
[00:36:30]                   │ debg comboBox.getComboBoxSelectedOptions, comboBoxSelector: mlJobWizardComboBoxCalendars > comboBoxInput
[00:36:30]                   │ debg TestSubjects.find(mlJobWizardComboBoxCalendars > comboBoxInput)
[00:36:30]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardComboBoxCalendars"] [data-test-subj="comboBoxInput"]') with timeout=10000
[00:36:30]                   └- ✓ pass  (2.8s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation assigns calendars"
[00:36:30]                 └-> job creation displays the model plot switch
[00:36:30]                   └-> "before each" hook: global before each
[00:36:30]                   │ debg TestSubjects.exists(mlJobWizardSwitchModelPlot)
[00:36:30]                   │ debg Find.existsByCssSelector('[data-test-subj="mlJobWizardSwitchModelPlot"]') with timeout=120000
[00:36:30]                   └- ✓ pass  (22ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays the model plot switch"
[00:36:30]                 └-> job creation enables the dedicated index switch
[00:36:30]                   └-> "before each" hook: global before each
[00:36:30]                   │ debg TestSubjects.exists(mlJobWizardSwitchUseDedicatedIndex)
[00:36:30]                   │ debg Find.existsByCssSelector('[data-test-subj="mlJobWizardSwitchUseDedicatedIndex"]') with timeout=120000
[00:36:30]                   │ debg TestSubjects.getAttribute(mlJobWizardSwitchUseDedicatedIndex, aria-checked)
[00:36:30]                   │ debg TestSubjects.find(mlJobWizardSwitchUseDedicatedIndex)
[00:36:30]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardSwitchUseDedicatedIndex"]') with timeout=10000
[00:36:30]                   │ debg TestSubjects.clickWhenNotDisabled(mlJobWizardSwitchUseDedicatedIndex)
[00:36:30]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlJobWizardSwitchUseDedicatedIndex"]') with timeout=10000
[00:36:30]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardSwitchUseDedicatedIndex"]') with timeout=10000
[00:36:31]                   │ debg TestSubjects.getAttribute(mlJobWizardSwitchUseDedicatedIndex, aria-checked)
[00:36:31]                   │ debg TestSubjects.find(mlJobWizardSwitchUseDedicatedIndex)
[00:36:31]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardSwitchUseDedicatedIndex"]') with timeout=10000
[00:36:31]                   └- ✓ pass  (279ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation enables the dedicated index switch"
[00:36:31]                 └-> job creation displays the validation step
[00:36:31]                   └-> "before each" hook: global before each
[00:36:31]                   │ debg TestSubjects.exists(mlJobWizardNavButtonNext)
[00:36:31]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=120000
[00:36:31]                   │ debg TestSubjects.clickWhenNotDisabled(mlJobWizardNavButtonNext)
[00:36:31]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=10000
[00:36:31]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=10000
[00:36:31]                   │ debg TestSubjects.exists(mlJobWizardStepTitleValidation)
[00:36:31]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardStepTitleValidation"]') with timeout=120000
[00:36:31]                   └- ✓ pass  (709ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays the validation step"
[00:36:31]                 └-> job creation displays the summary step
[00:36:31]                   └-> "before each" hook: global before each
[00:36:31]                   │ debg TestSubjects.exists(mlJobWizardNavButtonNext)
[00:36:31]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=120000
[00:36:31]                   │ debg TestSubjects.clickWhenNotDisabled(mlJobWizardNavButtonNext)
[00:36:31]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=10000
[00:36:31]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardNavButtonNext"]') with timeout=10000
[00:36:32]                   │ debg TestSubjects.exists(mlJobWizardStepTitleSummary)
[00:36:32]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardStepTitleSummary"]') with timeout=120000
[00:36:32]                   └- ✓ pass  (506ms) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays the summary step"
[00:36:32]                 └-> job creation creates the job and finishes processing
[00:36:32]                   └-> "before each" hook: global before each
[00:36:32]                   │ debg TestSubjects.exists(mlJobWizardButtonCreateJob)
[00:36:32]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobWizardButtonCreateJob"]') with timeout=120000
[00:36:32]                   │ debg TestSubjects.clickWhenNotDisabled(mlJobWizardButtonCreateJob)
[00:36:32]                   │ debg Find.clickByCssSelectorWhenNotDisabled('[data-test-subj="mlJobWizardButtonCreateJob"]') with timeout=10000
[00:36:32]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobWizardButtonCreateJob"]') with timeout=10000
[00:36:32]                   │ debg TestSubjects.exists(mlStartDatafeedModal)
[00:36:32]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlStartDatafeedModal"]') with timeout=10000
[00:36:32]                   │ info [o.e.c.m.MetaDataCreateIndexService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.ml-anomalies-custom-ec_advanced_2_1580277582964] creating index, cause [api], templates [.ml-anomalies-], shards [1]/[1], mappings [_doc]
[00:36:32]                   │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] updating number_of_replicas to [0] for indices [.ml-anomalies-custom-ec_advanced_2_1580277582964]
[00:36:32]                   │ info [o.e.c.r.a.AllocationService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[.ml-anomalies-custom-ec_advanced_2_1580277582964][0]]]).
[00:36:33]                   │ debg browser[INFO] http://localhost:6141/bundles/53.bundle.js 2:591513 "Response for job query:" Object
[00:36:33]                   │ debg browser[INFO] http://localhost:6141/bundles/53.bundle.js 2:601084 "checkSaveResponse(): save successful"
[00:36:33]                   │ debg TestSubjects.exists(mlStartDatafeedModal)
[00:36:33]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlStartDatafeedModal"]') with timeout=5000
[00:36:33]                   │ debg TestSubjects.click(mlStartDatafeedModalStartButton)
[00:36:33]                   │ debg Find.clickByCssSelector('[data-test-subj="mlStartDatafeedModalStartButton"]') with timeout=10000
[00:36:33]                   │ debg Find.findByCssSelector('[data-test-subj="mlStartDatafeedModalStartButton"]') with timeout=10000
[00:36:33]                   │ debg TestSubjects.missingOrFail(mlStartDatafeedModal)
[00:36:33]                   │ debg Find.waitForDeletedByCssSelector('[data-test-subj="mlStartDatafeedModal"]') with timeout=2500
[00:36:33]                   │ info [o.e.x.m.j.p.a.AutodetectProcessManager] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Opening job [ec_advanced_2_1580277582964]
[00:36:33]                   │ info [o.e.x.m.j.p.a.AutodetectProcessManager] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] Loading model snapshot [N/A], job latest_record_timestamp [N/A]
[00:36:34]                   │ info [o.e.x.m.p.l.CppLogMessageHandler] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] [autodetect/89607] [CResourceMonitor.cc@70] Setting model memory limit to 100 MB
[00:36:34]                   │ info [o.e.x.m.j.p.a.AutodetectProcessManager] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Successfully set job state to [opened] for job [ec_advanced_2_1580277582964]
[00:36:34]                   │ info [o.e.x.m.d.DatafeedJob] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] Datafeed started (from: 1970-01-01T00:00:00.000Z to: 2020-01-29T06:36:18.586Z) with frequency [600000ms]
[00:36:34]                   │ debg Waiting up to 120000ms for datafeed state to be stopped...
[00:36:34]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:34]                   │ debg --- retry.waitForWithTimeout error: expected job state to be stopped but got started
[00:36:34]                   │ info [o.e.c.m.MetaDataMappingService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.ml-anomalies-custom-ec_advanced_2_1580277582964/RcA8YpdVQjSDQEntAwWmdQ] update_mapping [_doc]
[00:36:34]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:34]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:35]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:35]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:35]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:35]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:36]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:36]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:36]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:36]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:37]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:37]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:37]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:37]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:38]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:38]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:38]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:38]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:39]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:39]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:39]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:39]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:40]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:40]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:41]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:41]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:41]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:41]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:42]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:42]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:42]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:42]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:43]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:43]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:43]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:43]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:44]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:44]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:44]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:44]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:45]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:45]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:45]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:45]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:46]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:46]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:46]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:46]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:47]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:47]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:47]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:47]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:48]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:48]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:48]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:48]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:49]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:49]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:49]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:49]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:50]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:50]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:50]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:50]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:51]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:51]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:51]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:51]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:52]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:52]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:52]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:52]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:53]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:53]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:53]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:53]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:54]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:54]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:54]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:54]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:55]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:55]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:55]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:55]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:56]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:56]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:56]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:56]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:57]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:57]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:57]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:57]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:58]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:58]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:58]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:58]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:59]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:59]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:36:59]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:36:59]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:00]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:00]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:00]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:00]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:01]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:01]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:01]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:02]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:02]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:02]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:03]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:03]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:03]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:03]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:04]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:04]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:04]                   │ info [o.e.x.m.d.DatafeedJob] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] Lookback has finished
[00:37:04]                   │ info [o.e.x.m.d.DatafeedManager] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [no_realtime] attempt to stop datafeed [datafeed-ec_advanced_2_1580277582964] for job [ec_advanced_2_1580277582964]
[00:37:04]                   │ info [o.e.x.m.d.DatafeedManager] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [no_realtime] try lock [20s] to stop datafeed [datafeed-ec_advanced_2_1580277582964] for job [ec_advanced_2_1580277582964]...
[00:37:04]                   │ info [o.e.x.m.d.DatafeedManager] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [no_realtime] stopping datafeed [datafeed-ec_advanced_2_1580277582964] for job [ec_advanced_2_1580277582964], acquired [true]...
[00:37:04]                   │ info [o.e.x.m.d.DatafeedManager] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [no_realtime] datafeed [datafeed-ec_advanced_2_1580277582964] for job [ec_advanced_2_1580277582964] has been stopped
[00:37:04]                   │ info [o.e.x.m.j.p.a.AutodetectProcessManager] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] Closing job [ec_advanced_2_1580277582964], because [close job (api)]
[00:37:04]                   │ info [o.e.x.m.p.l.CppLogMessageHandler] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] [autodetect/89607] [CCmdSkeleton.cc@45] Handled 4675 records
[00:37:04]                   │ info [o.e.x.m.p.l.CppLogMessageHandler] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] [autodetect/89607] [CAnomalyJob.cc@1499] Pruning all models
[00:37:04]                   │ debg Fetching datafeed state for datafeed datafeed-ec_advanced_2_1580277582964
[00:37:04]                   │ debg Waiting up to 120000ms for job state to be closed...
[00:37:04]                   │ debg Fetching job state for job ec_advanced_2_1580277582964
[00:37:04]                   │ debg --- retry.waitForWithTimeout error: expected job state to be closed but got closing
[00:37:05]                   │ debg Fetching job state for job ec_advanced_2_1580277582964
[00:37:05]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:05]                   │ info [o.e.c.m.MetaDataMappingService] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [.ml-anomalies-custom-ec_advanced_2_1580277582964/RcA8YpdVQjSDQEntAwWmdQ] update_mapping [_doc]
[00:37:05]                   │ info [o.e.x.m.j.p.a.o.AutodetectResultProcessor] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] 185 buckets parsed from autodetect output
[00:37:05]                   │ info [o.e.x.m.p.AbstractNativeProcess] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] State output finished
[00:37:05]                   │ debg Fetching job state for job ec_advanced_2_1580277582964
[00:37:05]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:06]                   │ info [o.e.x.m.j.p.a.AutodetectCommunicator] [kibana-ci-immutable-centos-tests-xl-1580275843994838274] [ec_advanced_2_1580277582964] job closed
[00:37:06]                   │ debg Fetching job state for job ec_advanced_2_1580277582964
[00:37:06]                   │ debg --- retry.waitForWithTimeout failed again with the same message...
[00:37:06]                   │ debg Fetching job state for job ec_advanced_2_1580277582964
[00:37:06]                   └- ✓ pass  (34.2s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation creates the job and finishes processing"
[00:37:06]                 └-> job creation displays the created job in the job list
[00:37:06]                   └-> "before each" hook: global before each
[00:37:06]                   │ debg TestSubjects.click(mlRefreshJobListButton)
[00:37:06]                   │ debg Find.clickByCssSelector('[data-test-subj="mlRefreshJobListButton"]') with timeout=10000
[00:37:06]                   │ debg Find.findByCssSelector('[data-test-subj="mlRefreshJobListButton"]') with timeout=10000
[00:37:06]                   │ debg TestSubjects.exists(~mlJobListTable)
[00:37:06]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="mlJobListTable"]') with timeout=60000
[00:37:06]                   │ debg TestSubjects.exists(mlJobListTable loaded)
[00:37:06]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobListTable loaded"]') with timeout=30000
[00:37:06]                   │ debg TestSubjects.exists(~mlJobListTable)
[00:37:06]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj~="mlJobListTable"]') with timeout=60000
[00:37:06]                   │ debg TestSubjects.exists(mlJobListTable loaded)
[00:37:06]                   │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="mlJobListTable loaded"]') with timeout=30000
[00:37:06]                   │ debg TestSubjects.find(mlJobListSearchBar)
[00:37:06]                   │ debg Find.findByCssSelector('[data-test-subj="mlJobListSearchBar"]') with timeout=10000
[00:37:07]                   │ debg TestSubjects.find(~mlJobListTable)
[00:37:07]                   │ debg Find.findByCssSelector('[data-test-subj~="mlJobListTable"]') with timeout=10000
[00:37:07]                   └- ✓ pass  (1.0s) "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays the created job in the job list"
[00:37:07]                 └-> job creation displays details for the created job in the job list
[00:37:07]                   └-> "before each" hook: global before each
[00:37:07]                   │ debg TestSubjects.find(~mlJobListTable)
[00:37:07]                   │ debg Find.findByCssSelector('[data-test-subj~="mlJobListTable"]') with timeout=10000
[00:37:07]                   │ info Taking screenshot "/dev/shm/workspace/kibana/x-pack/test/functional/screenshots/failure/machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays details for the created job in the job list.png"
[00:37:07]                   │ info Current URL is: http://localhost:6141/app/ml#/jobs?_g=(refreshInterval:(pause:!t,value:0))
[00:37:07]                   │ info Saving page source to: /dev/shm/workspace/kibana/x-pack/test/functional/failure_debug/html/machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays details for the created job in the job list.html
[00:37:07]                   └- ✖ fail: "machine learning anomaly detection advanced job with categorization detector and default datafeed settings job creation displays details for the created job in the job list"
[00:37:07]                   │

Stack Trace

{ Error: expected { id: 'ec_advanced_2_1580277582964',
  description: 'Create advanced job from ecommerce dataset with a categorization detector and default datafeed settings',
  jobGroups: [ 'advanced', 'automated', 'ecommerce' ],
  recordCount: '0',
  memoryStatus: 'ok',
  jobState: 'opened',
  datafeedState: 'started',
  latestTimestamp: '' } to sort of equal { id: 'ec_advanced_2_1580277582964',
  description: 'Create advanced job from ecommerce dataset with a categorization detector and default datafeed settings',
  jobGroups: [ 'advanced', 'automated', 'ecommerce' ],
  recordCount: '4,675',
  memoryStatus: 'ok',
  jobState: 'closed',
  datafeedState: 'stopped',
  latestTimestamp: '2019-07-12 23:45:36' }
    at Assertion.assert (/dev/shm/workspace/kibana/packages/kbn-expect/expect.js:100:11)
    at Assertion.eql (/dev/shm/workspace/kibana/packages/kbn-expect/expect.js:244:8)
    at MlJobTable.assertJobRowFields (test/functional/services/machine_learning/job_table.ts:181:25)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  actual:
   '{\n  "datafeedState": "started"\n  "description": "Create advanced job from ecommerce dataset with a categorization detector and default datafeed settings"\n  "id": "ec_advanced_2_1580277582964"\n  "jobGroups": [\n    "advanced"\n    "automated"\n    "ecommerce"\n  ]\n  "jobState": "opened"\n  "latestTimestamp": ""\n  "memoryStatus": "ok"\n  "recordCount": "0"\n}',
  expected:
   '{\n  "datafeedState": "stopped"\n  "description": "Create advanced job from ecommerce dataset with a categorization detector and default datafeed settings"\n  "id": "ec_advanced_2_1580277582964"\n  "jobGroups": [\n    "advanced"\n    "automated"\n    "ecommerce"\n  ]\n  "jobState": "closed"\n  "latestTimestamp": "2019-07-12 23:45:36"\n  "memoryStatus": "ok"\n  "recordCount": "4,675"\n}',
  showDiff: true }

History

To update your PR or re-run it, just comment with:
@elasticmachine merge upstream

@andrew-goldstein
Copy link
Contributor Author

This is the first time I've encountered a Build succeeded, but was flaky message. The build is flaky, taking over 2 hours to complete, but it appears to be unrelated to this PR. Since, per the screenshot below, I'm getting an All checks have passed, I'm merging this to master, and kicking off the 7.6 and 7.x backports.

all-checks-have-passed

@andrew-goldstein andrew-goldstein merged commit 9d4414d into elastic:master Jan 29, 2020
@andrew-goldstein andrew-goldstein deleted the overview-feedback branch January 29, 2020 07:33
andrew-goldstein added a commit to andrew-goldstein/kibana that referenced this pull request Jan 29, 2020
## [SIEM] Overview page feedback

Implements feedback and fixes to the Overview page

### Overview (default theme)

![01-overview-default-theme](https://user-images.githubusercontent.com/4459398/73315509-899c5500-41ed-11ea-9949-82853dd4ba59.png)

### Overview (dark theme)

![02-overview-dark-theme](https://user-images.githubusercontent.com/4459398/73315527-902acc80-41ed-11ea-9701-6a2c5fa40cce.png)

## Highlights

* The new order of widgets is Signals, Alerts, Events, Host Events, Network events, per elastic/siem-team#494

* Changed the default `External alerts count` `Stack by` to `event.module` elastic/siem-team#491

*  Added `event.module` to the `Events count` histogram elastic/siem-team#491

* Widget titles will no longer include the currently selected `Stack by option`. The widgets will use the same static title text that appears on the other pages (i.e.. `Signals count`, `External alerts count`, and `Events count`) elastic/siem-team#491

* The `Signals count` includes a `Stack by` that defaults to `signal.rule.threat.tatic.name`

* Standardized on a 300px widget height for all histograms in the app (thanks @MichaelMarcialis for paring on this!)

* The `Open as duplicate timeline` action is `Recent timelines` is now only shown when hovering over a recent timeline

## Loading States

* The `Recent timelines` and `Security news` widgets now use the horizontal bar loading indicator

* The `Host events` and `Network events` widgets now use the horizontal bar loading indicator

* The `Host events` and `Network events` Showing _n_ events subtitles are now hidden on initial load

* The counts in the `Host events` and `Network events` Showing _n_ events subtitles are now hidden on initial load

* We no longer hide some histogram subtitles after initial load, to prevent shifting of content when a user makes a `Stack by` selection

## News Feed Error State

![news-feed-error-state](https://user-images.githubusercontent.com/4459398/73316060-1e538280-41ef-11ea-83f5-b8d6e9fa3741.png)

* Fixed an issue where the `Security news` header was hidden when an invalid URL is configured

* Added a space between the word `via` and the `SIEM advanced settings` link

* Removed the capital “N” from "News" in the error message

## Misc Visual Changes

* Fixed text truncation of the `Severity` column in the `Detections` page's `Signals` table

* Added the “showing” subtitle to the `Signals count` histogram on the Detections page

* Increased the `Stack by` histogram selector and the `View signals | alerts | events' buttons from 8 to 24px

* Tweaked the border rendering in the Overview `Host Events` and `Network events` widget headers

* Added 8px of spacing between the Overview `Host Events` and `Network events` widget accordion headers and their contents

* Fixed an issue where the `Host events` and `Networ events` widgets didn't render in ie11 elastic/siem-team#499

## Non-Visual Fixes

* Removed an incorrect usage of `usememo`

* Removed the placeholder client-side username query from `x-pack/legacy/plugins/siem/public/components/recent_timelines/index.tsx`

* Updated the query of the Overview `Host events` widget to filter by "host.name exists"

* Updated the query of the Overview `Network events` widget to filter by "source.ip exists or destination.ip : exists"
gmmorris added a commit to gmmorris/kibana that referenced this pull request Jan 29, 2020
* master: (31 commits)
  [SIEM] Overview page feedback (elastic#56261)
  refactor (elastic#56131)
  [NP Cleanup] Remove ui/public/inspector (elastic#55677)
  [SIEM] [TIMELINE] Only add endpoint logo when on event.module === endgame (elastic#56263)
  Basic Functionality Alert List (elastic#55800)
  [SIEM] Fix filters on Hosts and Network page (elastic#56234)
  [SIEM] Adds ability to infer the newsfeed.enabled setting (elastic#56236)
  [SIEM][Detection Engine] critical blocker for updated rules
  [SIEM][Detection Engine] critical blocker, fixes ordering issue that causes rules to not run the first time
  [SIEM] Add link to endpoint app through reference.url (elastic#56211)
  [Metrics UI] Fixing title truncation in Metrics Explorer (elastic#55917)
  [SIEM] Put the notice for rules in comment block (elastic#56123)
  [SIEM][Detection Engine] critical blocker with the UI crashing
  Consistent timeouts for the Space onPostAuth interceptor tests (elastic#56158)
  Skip tests that depend on other skipped test
  [SIEM] [Detection Engine] Timestamps for rules (elastic#56197)
  Sort server-side in SavedObject export (elastic#55128)
  [Reporting] Document the 8.0 breaking changes (elastic#56187)
  Revert "[Monitoring] Change all configs to `monitoring.*`" (elastic#56214)
  add owners for es_archiver (elastic#56184)
  ...
andrew-goldstein added a commit that referenced this pull request Jan 29, 2020
## [SIEM] Overview page feedback

Implements feedback and fixes to the Overview page

### Overview (default theme)

![01-overview-default-theme](https://user-images.githubusercontent.com/4459398/73315509-899c5500-41ed-11ea-9949-82853dd4ba59.png)

### Overview (dark theme)

![02-overview-dark-theme](https://user-images.githubusercontent.com/4459398/73315527-902acc80-41ed-11ea-9701-6a2c5fa40cce.png)

## Highlights

* The new order of widgets is Signals, Alerts, Events, Host Events, Network events, per elastic/siem-team#494

* Changed the default `External alerts count` `Stack by` to `event.module` elastic/siem-team#491

*  Added `event.module` to the `Events count` histogram elastic/siem-team#491

* Widget titles will no longer include the currently selected `Stack by option`. The widgets will use the same static title text that appears on the other pages (i.e.. `Signals count`, `External alerts count`, and `Events count`) elastic/siem-team#491

* The `Signals count` includes a `Stack by` that defaults to `signal.rule.threat.tatic.name`

* Standardized on a 300px widget height for all histograms in the app (thanks @MichaelMarcialis for paring on this!)

* The `Open as duplicate timeline` action is `Recent timelines` is now only shown when hovering over a recent timeline

## Loading States

* The `Recent timelines` and `Security news` widgets now use the horizontal bar loading indicator

* The `Host events` and `Network events` widgets now use the horizontal bar loading indicator

* The `Host events` and `Network events` Showing _n_ events subtitles are now hidden on initial load

* The counts in the `Host events` and `Network events` Showing _n_ events subtitles are now hidden on initial load

* We no longer hide some histogram subtitles after initial load, to prevent shifting of content when a user makes a `Stack by` selection

## News Feed Error State

![news-feed-error-state](https://user-images.githubusercontent.com/4459398/73316060-1e538280-41ef-11ea-83f5-b8d6e9fa3741.png)

* Fixed an issue where the `Security news` header was hidden when an invalid URL is configured

* Added a space between the word `via` and the `SIEM advanced settings` link

* Removed the capital “N” from "News" in the error message

## Misc Visual Changes

* Fixed text truncation of the `Severity` column in the `Detections` page's `Signals` table

* Added the “showing” subtitle to the `Signals count` histogram on the Detections page

* Increased the `Stack by` histogram selector and the `View signals | alerts | events' buttons from 8 to 24px

* Tweaked the border rendering in the Overview `Host Events` and `Network events` widget headers

* Added 8px of spacing between the Overview `Host Events` and `Network events` widget accordion headers and their contents

* Fixed an issue where the `Host events` and `Networ events` widgets didn't render in ie11 elastic/siem-team#499

## Non-Visual Fixes

* Removed an incorrect usage of `usememo`

* Removed the placeholder client-side username query from `x-pack/legacy/plugins/siem/public/components/recent_timelines/index.tsx`

* Updated the query of the Overview `Host events` widget to filter by "host.name exists"

* Updated the query of the Overview `Network events` widget to filter by "source.ip exists or destination.ip : exists"
andrew-goldstein added a commit that referenced this pull request Jan 29, 2020
* [SIEM] Overview page feedback (#56261)

## [SIEM] Overview page feedback

Implements feedback and fixes to the Overview page

### Overview (default theme)

![01-overview-default-theme](https://user-images.githubusercontent.com/4459398/73315509-899c5500-41ed-11ea-9949-82853dd4ba59.png)

### Overview (dark theme)

![02-overview-dark-theme](https://user-images.githubusercontent.com/4459398/73315527-902acc80-41ed-11ea-9701-6a2c5fa40cce.png)

## Highlights

* The new order of widgets is Signals, Alerts, Events, Host Events, Network events, per elastic/siem-team#494

* Changed the default `External alerts count` `Stack by` to `event.module` elastic/siem-team#491

*  Added `event.module` to the `Events count` histogram elastic/siem-team#491

* Widget titles will no longer include the currently selected `Stack by option`. The widgets will use the same static title text that appears on the other pages (i.e.. `Signals count`, `External alerts count`, and `Events count`) elastic/siem-team#491

* The `Signals count` includes a `Stack by` that defaults to `signal.rule.threat.tatic.name`

* Standardized on a 300px widget height for all histograms in the app (thanks @MichaelMarcialis for paring on this!)

* The `Open as duplicate timeline` action is `Recent timelines` is now only shown when hovering over a recent timeline

## Loading States

* The `Recent timelines` and `Security news` widgets now use the horizontal bar loading indicator

* The `Host events` and `Network events` widgets now use the horizontal bar loading indicator

* The `Host events` and `Network events` Showing _n_ events subtitles are now hidden on initial load

* The counts in the `Host events` and `Network events` Showing _n_ events subtitles are now hidden on initial load

* We no longer hide some histogram subtitles after initial load, to prevent shifting of content when a user makes a `Stack by` selection

## News Feed Error State

![news-feed-error-state](https://user-images.githubusercontent.com/4459398/73316060-1e538280-41ef-11ea-83f5-b8d6e9fa3741.png)

* Fixed an issue where the `Security news` header was hidden when an invalid URL is configured

* Added a space between the word `via` and the `SIEM advanced settings` link

* Removed the capital “N” from "News" in the error message

## Misc Visual Changes

* Fixed text truncation of the `Severity` column in the `Detections` page's `Signals` table

* Added the “showing” subtitle to the `Signals count` histogram on the Detections page

* Increased the `Stack by` histogram selector and the `View signals | alerts | events' buttons from 8 to 24px

* Tweaked the border rendering in the Overview `Host Events` and `Network events` widget headers

* Added 8px of spacing between the Overview `Host Events` and `Network events` widget accordion headers and their contents

* Fixed an issue where the `Host events` and `Networ events` widgets didn't render in ie11 elastic/siem-team#499

## Non-Visual Fixes

* Removed an incorrect usage of `usememo`

* Removed the placeholder client-side username query from `x-pack/legacy/plugins/siem/public/components/recent_timelines/index.tsx`

* Updated the query of the Overview `Host events` widget to filter by "host.name exists"

* Updated the query of the Overview `Network events` widget to filter by "source.ip exists or destination.ip : exists"

* Removed the following unused translations that were failing the i18n Compatibility Checks:

```
xpack.siem.overview.alertsCountByTitle
xpack.siem.overview.eventsCountByTitle
xpack.siem.overview.signalsByCategoryTitle
```

The following files were updated:

* `x-pack/plugins/translations/translations/zh-CN.json`
* `x-pack/plugins/translations/translations/ja-JP.json`
jloleysens added a commit to jloleysens/kibana that referenced this pull request Jan 29, 2020
…55831

* '7.x' of github.com:elastic/kibana: (78 commits)
  Re-enable watcher FireFox functional test (elastic#56112) (elastic#56294)
  [Metrics UI] Fixing title truncation in Metrics Explorer (elastic#55917) (elastic#56248)
  [APM] x-axis labels on Error occurrences chart are incorrect based on Kibana timezone (elastic#55686) (elastic#56288)
  Migrate saved_object_save_as_checkbox directive to timelion (elastic#56114) (elastic#56286)
  [APM] Treat error.exception.stacktrace.line as optional (elastic#55733) (elastic#55840)
  Remove alerts and actions from feature catalogue (elastic#56140) (elastic#56208)
  Migrate UI capabilities to use new platform APIs (elastic#56070) (elastic#56207)
  [ML] Add functional tests for analytics UI: creation addition and regression/outlier results (elastic#56059) (elastic#56191)
  [SIEM] Overview page feedback (elastic#56261) (elastic#56276)
  [NP Cleanup] Remove ui/public/inspector (elastic#55677) (elastic#56271)
  [Index template] Fix editor should support mappings types (elastic#55804)
  fixes map index message (elastic#56104) (elastic#56194)
  [SIEM] [TIMELINE] Only add endpoint logo when on event.module === endgame (elastic#56263) (elastic#56269)
  [SIEM] Fix filters on Hosts and Network page (elastic#56234) (elastic#56267)
  [SIEM] Adds ability to infer the newsfeed.enabled setting (elastic#56236) (elastic#56265)
  [SIEM][Detection Engine] critical blocker for updated rules (elastic#56259)
  [SIEM] Put the notice for rules in comment block (elastic#56123) (elastic#56246)
  [SIEM][Detection Engine] critical blocker, fixes ordering issue that causes rules to not run the first time (elastic#56256)
  [Reporting/NP] Migration of Reporting Security dependency (elastic#56046) (elastic#56198)
  [SIEM] Add link to endpoint app through reference.url (elastic#56211) (elastic#56250)
  ...

# Conflicts:
#	x-pack/plugins/watcher/public/plugin.ts
rylnd added a commit to rylnd/kibana that referenced this pull request Mar 5, 2020
This was left over as a result of elastic#56261
rylnd added a commit that referenced this pull request Mar 10, 2020
…59438)

* Convert our manual throwing of TypeError to a custom Error

Throwing a TypeError meant that our manual errors were indistinguishable
from, say, trying to invoke a method on undefined. This adds a custom
error, BadRequestError, that disambiguates that situation.

* Present API Error messages to the user

With Core's new HTTP client, an unsuccessful API call will raise an
error containing the body of the response it received. In the case of
SIEM endpoints, this will include a useful error message with
potentially more specificity than e.g. 'Internal Server Error'.

This adds a type predicate to check for such errors, and adds a handling
case in our errorToToaster handler.

If the error does not contain our SIEM-specific message, it will fall
through as normal and the general error.message will be displayed in the
toaster.

* Remove unnecessary use of throwIfNotOk in our client API calls

The new HTTP client raises an error on a 4xx or 5xx response, so there
should not be a case where throwIfNotOk is actually going to throw an
error.

The established pattern on the frontend is to catch errors at the call
site and handle them appropriately, so I'm mainly just verifying that
these are caught where they're used, now.

* Move errorToToaster and ToasterError to general location

These were living in ML since that's where they originated. However, we
have need of it (and already use it) elsewhere.

The basic pattern for error handling on the frontend is:
1) API call throws error
2) caller catches error and dispatches a toast

throwIfNotOk is meant to convert the error into a useful message in 1).
We currently use both errorToToaster and displayErrorToast to display
that in a toaster in 2)

Now that errorToToaster handles a few different types of errors, and
throwIfNotOk is going to be bypassed due to the new client behavior of
throwing on error, we're going to start consolidating on:

1) Api call throws error
2) caller catches error and passes it to errorToToaster

* Refactor Rules API functions to not use throwIfNotOk

* Ensures that all callers of these methods properly catch errors
* Updates error toasterification to use errorToToaster
* Simplifies tests now that we mainly just invoke the http client and
return the result.

throwIfNotOk is not being used in the majority of cases, as the client
raises an error and bypasses that call.

The few cases this might break are where we return a 200 but have errors
within the response. Whether throwIfNotOk handled this or not, I'll need
a simpler helper to accomplish the same behavior.

* Define a type for our BulkRule responses

These can be an array of errors OR rules; typing it as such forces
downstream to deal with both. enableRules was being handled correctly
with the bucketing helper, and TS has confirmed the rest are as well.

This obviates the need to raise from our API calls, as bulk errors are
recoverable and we want to both a) continue on with any successful rules
and b) handle the errors as necessary. This is highly dependent on the
caller and so we can't/shouldn't handle it here.

* Address case where bulk rules errors were not handled

I'm not sure that we're ever using this non-dispatch version, but it was
throwing a type error. Will bring it up in review.

* Remove more throwIfNotOk uses from API calls

These are unneeded as an error response will already throw an error to
be handled at the call site.

* Display an error toaster on newsfeed fetch failure

* Remove dead code

This was left over as a result of #56261

* Remove throwIfNotOk from case API calls

Again, not needed because the client already throws.

* Update use_get_tags for NP

* Gets rid of throwIfNotOK usage
* uses core http fetch

* Remove throwIfNotOk from signals API

* Remove throwIfNotOk

This served the same purpose as errorToToaster, but in a less robust
way. All usages have been replaced, so now we say goodbye.

* Remove custom errors in favor of KibanaApiError and isApiError type predicate

There was no functional difference between these two code paths, and
removing these custom errors allowed us to delete a bunch of associated
code as well..

* Fix test failures

These were mainly related to my swapping any remaining fetch calls with
the core router as good kibana denizens should :salute:

* Replace use of core mocks with our simpler local ones

This is enough to get our tests to pass. We can't use the core mocks for
now since there are circular dependencies there, which breaks our build.

* add signal api unit tests

* privilege unit test api

* Add unit tests on the signals container

* Refactor signals API tests to use core mocks

* Simplifies our mocking verbosity by leveraging core mocks
* Simplifies test setup by isolating a reference to our fetch mock
* Abstracts response structure to pure helper functions

The try/catch tests had some false positives in that nothing would be
asserted if the code did not throw an error. These proved to be masking
a gap in coverage for our get/create signal index requests, which do not
leverage `throwIfNotOk` but instead rely on the fetch to throw an error;
once that behavior is verified we can update those tests to have our
fetchMock throw errors, and we should be all set.

* Simplify signals API tests now that the subjects do less

We no longer re-throw errors, or parse the response, we just return the
result of the client call. Simple!

* Simplify API functions to use implict returns

When possible. Also adds missing error-throwing documentation where
necessary.

* Revert "Display an error toaster on newsfeed fetch failure"

This reverts commit 6421322.

* Error property is readonly

* Pull uuid generation into default argument value

* Fix type predicate isApiError

Uses has to properly inspect our errorish object. Turns out we have a
'message' property, not an 'error' property.

* Fix test setup following modification of type predicate

We need a message (via new Error), a body.message, and a
body.status_code to satisfy isApiError.

Co-authored-by: Xavier Mouligneau <189600+XavierM@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
rylnd added a commit that referenced this pull request Mar 10, 2020
…59438) (#59757)

* Convert our manual throwing of TypeError to a custom Error

Throwing a TypeError meant that our manual errors were indistinguishable
from, say, trying to invoke a method on undefined. This adds a custom
error, BadRequestError, that disambiguates that situation.

* Present API Error messages to the user

With Core's new HTTP client, an unsuccessful API call will raise an
error containing the body of the response it received. In the case of
SIEM endpoints, this will include a useful error message with
potentially more specificity than e.g. 'Internal Server Error'.

This adds a type predicate to check for such errors, and adds a handling
case in our errorToToaster handler.

If the error does not contain our SIEM-specific message, it will fall
through as normal and the general error.message will be displayed in the
toaster.

* Remove unnecessary use of throwIfNotOk in our client API calls

The new HTTP client raises an error on a 4xx or 5xx response, so there
should not be a case where throwIfNotOk is actually going to throw an
error.

The established pattern on the frontend is to catch errors at the call
site and handle them appropriately, so I'm mainly just verifying that
these are caught where they're used, now.

* Move errorToToaster and ToasterError to general location

These were living in ML since that's where they originated. However, we
have need of it (and already use it) elsewhere.

The basic pattern for error handling on the frontend is:
1) API call throws error
2) caller catches error and dispatches a toast

throwIfNotOk is meant to convert the error into a useful message in 1).
We currently use both errorToToaster and displayErrorToast to display
that in a toaster in 2)

Now that errorToToaster handles a few different types of errors, and
throwIfNotOk is going to be bypassed due to the new client behavior of
throwing on error, we're going to start consolidating on:

1) Api call throws error
2) caller catches error and passes it to errorToToaster

* Refactor Rules API functions to not use throwIfNotOk

* Ensures that all callers of these methods properly catch errors
* Updates error toasterification to use errorToToaster
* Simplifies tests now that we mainly just invoke the http client and
return the result.

throwIfNotOk is not being used in the majority of cases, as the client
raises an error and bypasses that call.

The few cases this might break are where we return a 200 but have errors
within the response. Whether throwIfNotOk handled this or not, I'll need
a simpler helper to accomplish the same behavior.

* Define a type for our BulkRule responses

These can be an array of errors OR rules; typing it as such forces
downstream to deal with both. enableRules was being handled correctly
with the bucketing helper, and TS has confirmed the rest are as well.

This obviates the need to raise from our API calls, as bulk errors are
recoverable and we want to both a) continue on with any successful rules
and b) handle the errors as necessary. This is highly dependent on the
caller and so we can't/shouldn't handle it here.

* Address case where bulk rules errors were not handled

I'm not sure that we're ever using this non-dispatch version, but it was
throwing a type error. Will bring it up in review.

* Remove more throwIfNotOk uses from API calls

These are unneeded as an error response will already throw an error to
be handled at the call site.

* Display an error toaster on newsfeed fetch failure

* Remove dead code

This was left over as a result of #56261

* Remove throwIfNotOk from case API calls

Again, not needed because the client already throws.

* Update use_get_tags for NP

* Gets rid of throwIfNotOK usage
* uses core http fetch

* Remove throwIfNotOk from signals API

* Remove throwIfNotOk

This served the same purpose as errorToToaster, but in a less robust
way. All usages have been replaced, so now we say goodbye.

* Remove custom errors in favor of KibanaApiError and isApiError type predicate

There was no functional difference between these two code paths, and
removing these custom errors allowed us to delete a bunch of associated
code as well..

* Fix test failures

These were mainly related to my swapping any remaining fetch calls with
the core router as good kibana denizens should :salute:

* Replace use of core mocks with our simpler local ones

This is enough to get our tests to pass. We can't use the core mocks for
now since there are circular dependencies there, which breaks our build.

* add signal api unit tests

* privilege unit test api

* Add unit tests on the signals container

* Refactor signals API tests to use core mocks

* Simplifies our mocking verbosity by leveraging core mocks
* Simplifies test setup by isolating a reference to our fetch mock
* Abstracts response structure to pure helper functions

The try/catch tests had some false positives in that nothing would be
asserted if the code did not throw an error. These proved to be masking
a gap in coverage for our get/create signal index requests, which do not
leverage `throwIfNotOk` but instead rely on the fetch to throw an error;
once that behavior is verified we can update those tests to have our
fetchMock throw errors, and we should be all set.

* Simplify signals API tests now that the subjects do less

We no longer re-throw errors, or parse the response, we just return the
result of the client call. Simple!

* Simplify API functions to use implict returns

When possible. Also adds missing error-throwing documentation where
necessary.

* Revert "Display an error toaster on newsfeed fetch failure"

This reverts commit 6421322.

* Error property is readonly

* Pull uuid generation into default argument value

* Fix type predicate isApiError

Uses has to properly inspect our errorish object. Turns out we have a
'message' property, not an 'error' property.

* Fix test setup following modification of type predicate

We need a message (via new Error), a body.message, and a
body.status_code to satisfy isApiError.

Co-authored-by: Xavier Mouligneau <189600+XavierM@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>

Co-authored-by: Xavier Mouligneau <189600+XavierM@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
jkelastic pushed a commit to jkelastic/kibana that referenced this pull request Mar 12, 2020
…lastic#59438)

* Convert our manual throwing of TypeError to a custom Error

Throwing a TypeError meant that our manual errors were indistinguishable
from, say, trying to invoke a method on undefined. This adds a custom
error, BadRequestError, that disambiguates that situation.

* Present API Error messages to the user

With Core's new HTTP client, an unsuccessful API call will raise an
error containing the body of the response it received. In the case of
SIEM endpoints, this will include a useful error message with
potentially more specificity than e.g. 'Internal Server Error'.

This adds a type predicate to check for such errors, and adds a handling
case in our errorToToaster handler.

If the error does not contain our SIEM-specific message, it will fall
through as normal and the general error.message will be displayed in the
toaster.

* Remove unnecessary use of throwIfNotOk in our client API calls

The new HTTP client raises an error on a 4xx or 5xx response, so there
should not be a case where throwIfNotOk is actually going to throw an
error.

The established pattern on the frontend is to catch errors at the call
site and handle them appropriately, so I'm mainly just verifying that
these are caught where they're used, now.

* Move errorToToaster and ToasterError to general location

These were living in ML since that's where they originated. However, we
have need of it (and already use it) elsewhere.

The basic pattern for error handling on the frontend is:
1) API call throws error
2) caller catches error and dispatches a toast

throwIfNotOk is meant to convert the error into a useful message in 1).
We currently use both errorToToaster and displayErrorToast to display
that in a toaster in 2)

Now that errorToToaster handles a few different types of errors, and
throwIfNotOk is going to be bypassed due to the new client behavior of
throwing on error, we're going to start consolidating on:

1) Api call throws error
2) caller catches error and passes it to errorToToaster

* Refactor Rules API functions to not use throwIfNotOk

* Ensures that all callers of these methods properly catch errors
* Updates error toasterification to use errorToToaster
* Simplifies tests now that we mainly just invoke the http client and
return the result.

throwIfNotOk is not being used in the majority of cases, as the client
raises an error and bypasses that call.

The few cases this might break are where we return a 200 but have errors
within the response. Whether throwIfNotOk handled this or not, I'll need
a simpler helper to accomplish the same behavior.

* Define a type for our BulkRule responses

These can be an array of errors OR rules; typing it as such forces
downstream to deal with both. enableRules was being handled correctly
with the bucketing helper, and TS has confirmed the rest are as well.

This obviates the need to raise from our API calls, as bulk errors are
recoverable and we want to both a) continue on with any successful rules
and b) handle the errors as necessary. This is highly dependent on the
caller and so we can't/shouldn't handle it here.

* Address case where bulk rules errors were not handled

I'm not sure that we're ever using this non-dispatch version, but it was
throwing a type error. Will bring it up in review.

* Remove more throwIfNotOk uses from API calls

These are unneeded as an error response will already throw an error to
be handled at the call site.

* Display an error toaster on newsfeed fetch failure

* Remove dead code

This was left over as a result of elastic#56261

* Remove throwIfNotOk from case API calls

Again, not needed because the client already throws.

* Update use_get_tags for NP

* Gets rid of throwIfNotOK usage
* uses core http fetch

* Remove throwIfNotOk from signals API

* Remove throwIfNotOk

This served the same purpose as errorToToaster, but in a less robust
way. All usages have been replaced, so now we say goodbye.

* Remove custom errors in favor of KibanaApiError and isApiError type predicate

There was no functional difference between these two code paths, and
removing these custom errors allowed us to delete a bunch of associated
code as well..

* Fix test failures

These were mainly related to my swapping any remaining fetch calls with
the core router as good kibana denizens should :salute:

* Replace use of core mocks with our simpler local ones

This is enough to get our tests to pass. We can't use the core mocks for
now since there are circular dependencies there, which breaks our build.

* add signal api unit tests

* privilege unit test api

* Add unit tests on the signals container

* Refactor signals API tests to use core mocks

* Simplifies our mocking verbosity by leveraging core mocks
* Simplifies test setup by isolating a reference to our fetch mock
* Abstracts response structure to pure helper functions

The try/catch tests had some false positives in that nothing would be
asserted if the code did not throw an error. These proved to be masking
a gap in coverage for our get/create signal index requests, which do not
leverage `throwIfNotOk` but instead rely on the fetch to throw an error;
once that behavior is verified we can update those tests to have our
fetchMock throw errors, and we should be all set.

* Simplify signals API tests now that the subjects do less

We no longer re-throw errors, or parse the response, we just return the
result of the client call. Simple!

* Simplify API functions to use implict returns

When possible. Also adds missing error-throwing documentation where
necessary.

* Revert "Display an error toaster on newsfeed fetch failure"

This reverts commit 6421322.

* Error property is readonly

* Pull uuid generation into default argument value

* Fix type predicate isApiError

Uses has to properly inspect our errorish object. Turns out we have a
'message' property, not an 'error' property.

* Fix test setup following modification of type predicate

We need a message (via new Error), a body.message, and a
body.status_code to satisfy isApiError.

Co-authored-by: Xavier Mouligneau <189600+XavierM@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
release_note:skip Skip the PR/issue when compiling release notes Team:SIEM v7.6.0 v7.7.0 v8.0.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants