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

Improves the formatting of array values and JSON in the Event and Alert Details panels #115141

Conversation

andrew-goldstein
Copy link
Contributor

@andrew-goldstein andrew-goldstein commented Oct 15, 2021

[Security Solution] Improves the formatting of array values and JSON in the Event and Alert Details panels

This PR improves the formatting of array values and JSON in the Event and Alert details panels by:

  • in the Table tab, formatting array values such that each value appears on a separate line, (instead of joining the values on a single line)
  • in the JSON tab, displaying the raw search hit JSON, instead displaying a JSON representation based on the Fields API

Table value formatting

In the Event and Alert details Table tab, array values were joined on a single line, as shown in the before screenshot below:

event-details-value-formatting-before

Above: (before) array values were joined on a single line

Array values are now formatted such that each value appears on a separate line, as shown in the after screenshot below:

event-details-value-formatting-after

Above: (after) array values each appear on a separte line

JSON formatting

The JSON tab previously displayed a JSON representation based on the Fields API. Array values were previously represented as a joined string, as shown in the before screenshot below:

event-details-json-formatting-before

Above: (before) array values were previously represented as a joined string

The JSON tab now displays the raw search hit JSON, per the after screenshot below:

event-details-json-formatting-after

Above: (after) the JSON tab displays the raw search hit

CC @monina-n @paulewing

@andrew-goldstein andrew-goldstein added release_note:enhancement v8.0.0 auto-backport Deprecated - use backport:version if exact versions are needed v7.16.0 Team:Threat Hunting:Investigations Security Solution Investigations Team labels Oct 15, 2021
@andrew-goldstein andrew-goldstein self-assigned this Oct 15, 2021
@andrew-goldstein andrew-goldstein changed the title [Security Solution] Improves the formatting of array values and JSON in the Event and Alert Details panels [Draft] [Security Solution] Improves the formatting of array values and JSON in the Event and Alert Details panels Oct 15, 2021
…ON in the Event and Alert Details panels

This PR improves the formatting of array values and JSON in the Event and Alert details panels by:

- in the `Table` tab, formatting array values such that each value appears on a separate line, (instead of joining the values on a single line)
- in the `JSON` tab, displaying the raw search hit JSON, instead displaying a JSON representation based on the `Fields` API

### Table value formatting

In the Event and Alert details `Table` tab, array values were joined on a single line, as shown in the _before_ screenshot below:

![event-details-value-formatting-before](https://user-images.githubusercontent.com/4459398/137524968-6450cd73-3154-457d-b850-32a3e7faaab2.png)

_Above: (before) array values were joined on a single line_

Array values are now formatted such that each value appears on a separate line, as shown in the _after_ screenshot below:

![event-details-value-formatting-after](https://user-images.githubusercontent.com/4459398/137436705-b0bec735-5a83-402e-843a-2776e1c80da9.png)

_Above: (after) array values each appear on a separte line_

### JSON formatting

The `JSON` tab previously displayed a JSON representation based on the `Fields` API. Array values were previously represented as a joined string, as shown in the _before_ screenshot below:

![event-details-json-formatting-before](https://user-images.githubusercontent.com/4459398/137525039-d1b14f21-5f9c-4201-905e-8b08f00bb5a0.png)

_Above: (before) array values were previously represented as a joined string_

The `JSON` tab now displays the raw search hit JSON, per the _after_ screenshot below:

![event-details-json-formatting-after](https://user-images.githubusercontent.com/4459398/137437257-330c5b49-a4ad-418e-a976-923f7a35c0cf.png)

_Above: (after) the `JSON` tab displays the raw search hit_

CC @monina-n @paulewing
@andrew-goldstein andrew-goldstein force-pushed the array-value-and-json-formatting-improvements branch from cd3b0ad to deb7f06 Compare October 18, 2021 17:15
@andrew-goldstein andrew-goldstein changed the title [Draft] [Security Solution] Improves the formatting of array values and JSON in the Event and Alert Details panels Improves the formatting of array values and JSON in the Event and Alert Details panels Oct 18, 2021
@andrew-goldstein andrew-goldstein marked this pull request as ready for review October 18, 2021 18:10
@andrew-goldstein andrew-goldstein requested review from a team as code owners October 18, 2021 18:10
<EuiText size="xs" key={value}>
{value}
</EuiText>
<EuiFlexItem grow={false} key={`${i}-${value}`}>
Copy link
Contributor

Choose a reason for hiding this comment

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

Figure they aren't re-orderable so shouldn't be an issue, but can we not use index here? 🤷🏾

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The original code used key={value}, but that's not correct because users may index a document like:

POST /test-delete-me/_doc/1?pretty
{
    "has_dupes": ["foo", "bar", "baz", "foo"]
}

, which when retrieved via GET /test-delete-me/_doc/1?pretty returns the non-unique values in the array:

{
  "_index" : "test-delete-me",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "has_dupes" : [
      "foo",
      "bar",
      "baz",
      "foo"
    ]
  }
}

The official React docs on lists and keys link to Index as a key is an anti-pattern, which recommends evaluating three conditions to determine whether or not it's safe to use index as a key:

To help you decide, I put together three conditions which these examples have in common:

1. the list and items are static–they are not computed and do not change;
2. the items in the list have no ids;
3. the list is never reordered or filtered.

When all of them are met, you may safely use the index as a key.

Applying the criteria above, the details panel fails condition 3:

3. the list is never reordered or filtered.

because users can filter the view by value, as shown in the screenshot below:

filter-by-value

@@ -42,7 +42,7 @@ export const useTimelineEventsDetails = ({
indexName,
eventId,
skip,
}: UseTimelineEventsDetailsProps): [boolean, EventsArgs['detailsData']] => {
}: UseTimelineEventsDetailsProps): [boolean, EventsArgs['detailsData'], object | undefined] => {
Copy link
Contributor

Choose a reason for hiding this comment

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

just curious, why undefined instead of null?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

just curious, why undefined instead of null?

I chose undefined instead of null, because (just) null is valid JSON, but undefined is not valid JSON, which (perhaps subjectively) makes undefined a better sentinel value to represent "no data".

For example, entering the following in Chrome dev tools:

JSON.parse(null)

has the following output:

null

because null is valid JSON, but entering:

JSON.parse(undefined)

has the following output:

VM324:1 Uncaught SyntaxError: Unexpected token u in JSON at position 0
    at JSON.parse (<anonymous>)
    at <anonymous>:1:6

Copy link
Contributor

@michaelolo24 michaelolo24 left a comment

Choose a reason for hiding this comment

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

This looks great, thanks for putting this through! Tested the table view as well as the JSON view, and the array values are properly formatted and the JSON view is properly formatted in both the alert table flyout and timeline flyout. Thanks!!

@andrew-goldstein andrew-goldstein enabled auto-merge (squash) October 19, 2021 04:48
@andrew-goldstein
Copy link
Contributor Author

@elasticmachine merge upstream

@kibanamachine
Copy link
Contributor

💛 Build succeeded, but was flaky


Test Failures

Kibana Pipeline / general / Chrome X-Pack UI Functional Tests.x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout·ts.Uptime app with real-world data uptime alerts overview page alert flyout controls can save alert

Link to Jenkins

Standard Out

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

[00:00:00]     │
[00:00:00]       └-: Uptime app
[00:00:00]         └-> "before all" hook in "Uptime app"
[00:00:00]         └-: with real-world data
[00:00:00]           └-> "before all" hook in "with real-world data"
[00:00:00]           └-> "before all" hook in "with real-world data"
[00:00:00]             │ info [x-pack/test/functional/es_archives/uptime/full_heartbeat] Loading "mappings.json"
[00:00:00]             │ info [x-pack/test/functional/es_archives/uptime/full_heartbeat] Loading "data.json.gz"
[00:00:00]             │ info [o.e.c.m.MetadataCreateIndexService] [node-01] [heartbeat-8-full-test] creating index, cause [api], templates [], shards [1]/[1]
[00:00:00]             │ info [x-pack/test/functional/es_archives/uptime/full_heartbeat] Created index "heartbeat-8-full-test"
[00:00:00]             │ debg [x-pack/test/functional/es_archives/uptime/full_heartbeat] "heartbeat-8-full-test" settings {"index":{"mapping":{"total_fields":{"limit":"10000"}},"number_of_replicas":"1","number_of_shards":"1","query":{"default_field":["message","tags","agent.ephemeral_id","agent.id","agent.name","agent.type","agent.version","as.organization.name","client.address","client.as.organization.name","client.domain","client.geo.city_name","client.geo.continent_name","client.geo.country_iso_code","client.geo.country_name","client.geo.name","client.geo.region_iso_code","client.geo.region_name","client.mac","client.user.domain","client.user.email","client.user.full_name","client.user.group.id","client.user.group.name","client.user.hash","client.user.id","client.user.name","cloud.account.id","cloud.availability_zone","cloud.instance.id","cloud.instance.name","cloud.machine.type","cloud.provider","cloud.region","container.id","container.image.name","container.image.tag","container.name","container.runtime","destination.address","destination.as.organization.name","destination.domain","destination.geo.city_name","destination.geo.continent_name","destination.geo.country_iso_code","destination.geo.country_name","destination.geo.name","destination.geo.region_iso_code","destination.geo.region_name","destination.mac","destination.user.domain","destination.user.email","destination.user.full_name","destination.user.group.id","destination.user.group.name","destination.user.hash","destination.user.id","destination.user.name","dns.answers.class","dns.answers.data","dns.answers.name","dns.answers.type","dns.header_flags","dns.id","dns.op_code","dns.question.class","dns.question.name","dns.question.registered_domain","dns.question.type","dns.response_code","dns.type","ecs.version","error.code","error.id","error.message","event.action","event.category","event.code","event.dataset","event.hash","event.id","event.kind","event.module","event.original","event.outcome","event.provider","event.timezone","event.type","file.device","file.directory","file.extension","file.gid","file.group","file.hash.md5","file.hash.sha1","file.hash.sha256","file.hash.sha512","file.inode","file.mode","file.name","file.owner","file.path","file.target_path","file.type","file.uid","geo.city_name","geo.continent_name","geo.country_iso_code","geo.country_name","geo.name","geo.region_iso_code","geo.region_name","group.id","group.name","hash.md5","hash.sha1","hash.sha256","hash.sha512","host.architecture","host.geo.city_name","host.geo.continent_name","host.geo.country_iso_code","host.geo.country_name","host.geo.name","host.geo.region_iso_code","host.geo.region_name","host.hostname","host.id","host.mac","host.name","host.os.family","host.os.full","host.os.kernel","host.os.name","host.os.platform","host.os.version","host.type","host.user.domain","host.user.email","host.user.full_name","host.user.group.id","host.user.group.name","host.user.hash","host.user.id","host.user.name","http.request.body.content","http.request.method","http.request.referrer","http.response.body.content","http.version","log.level","log.logger","log.original","network.application","network.community_id","network.direction","network.iana_number","network.name","network.protocol","network.transport","network.type","observer.geo.city_name","observer.geo.continent_name","observer.geo.country_iso_code","observer.geo.country_name","observer.geo.name","observer.geo.region_iso_code","observer.geo.region_name","observer.hostname","observer.mac","observer.os.family","observer.os.full","observer.os.kernel","observer.os.name","observer.os.platform","observer.os.version","observer.serial_number","observer.type","observer.vendor","observer.version","organization.id","organization.name","os.family","os.full","os.kernel","os.name","os.platform","os.version","process.args","process.executable","process.hash.md5","process.hash.sha1","process.hash.sha256","process.hash.sha512","process.name","process.thread.name","process.title","process.working_directory","server.address","server.as.organization.name","server.domain","server.geo.city_name","server.geo.continent_name","server.geo.country_iso_code","server.geo.country_name","server.geo.name","server.geo.region_iso_code","server.geo.region_name","server.mac","server.user.domain","server.user.email","server.user.full_name","server.user.group.id","server.user.group.name","server.user.hash","server.user.id","server.user.name","service.ephemeral_id","service.id","service.name","service.state","service.type","service.version","source.address","source.as.organization.name","source.domain","source.geo.city_name","source.geo.continent_name","source.geo.country_iso_code","source.geo.country_name","source.geo.name","source.geo.region_iso_code","source.geo.region_name","source.mac","source.user.domain","source.user.email","source.user.full_name","source.user.group.id","source.user.group.name","source.user.hash","source.user.id","source.user.name","tracing.trace.id","tracing.transaction.id","url.domain","url.fragment","url.full","url.original","url.password","url.path","url.query","url.scheme","url.username","user.domain","user.email","user.full_name","user.group.id","user.group.name","user.hash","user.id","user.name","user_agent.device.name","user_agent.name","user_agent.original","user_agent.os.family","user_agent.os.full","user_agent.os.kernel","user_agent.os.name","user_agent.os.platform","user_agent.os.version","user_agent.version","agent.hostname","error.type","timeseries.instance","cloud.project.id","cloud.image.id","host.os.build","host.os.codename","kubernetes.pod.name","kubernetes.pod.uid","kubernetes.namespace","kubernetes.node.name","kubernetes.replicaset.name","kubernetes.deployment.name","kubernetes.statefulset.name","kubernetes.container.name","kubernetes.container.image","jolokia.agent.version","jolokia.agent.id","jolokia.server.product","jolokia.server.version","jolokia.server.vendor","jolokia.url","monitor.type","monitor.name","monitor.id","monitor.status","monitor.check_group","http.response.body.hash","fields.*"]},"refresh_interval":"5s"}}
[00:00:01]             │ info [x-pack/test/functional/es_archives/uptime/full_heartbeat] Indexed 2000 docs into "heartbeat-8-full-test"
[00:00:01]             │ debg replacing kibana config doc: {"dateFormat:tz":"UTC"}
[00:00:03]           └-: uptime alerts
[00:00:03]             └-> "before all" hook in "uptime alerts"
[00:00:03]             └-: overview page alert flyout controls
[00:00:03]               └-> "before all" hook for "can open alert flyout"
[00:00:03]               └-> "before all" hook for "can open alert flyout"
[00:00:03]               └-> can open alert flyout
[00:00:03]                 └-> "before each" hook: global before each for "can open alert flyout"
[00:00:03]                 │ debg TestSubjects.exists(uptimeSettingsToOverviewLink)
[00:00:03]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="uptimeSettingsToOverviewLink"]') with timeout=0
[00:00:03]                 │ debg --- retry.tryForTime error: [data-test-subj="uptimeSettingsToOverviewLink"] is not displayed
[00:00:03]                 │ debg navigating to uptime url: http://localhost:61181/app/uptime
[00:00:03]                 │ debg navigate to: http://localhost:61181/app/uptime
[00:00:03]                 │ debg browser[INFO] http://localhost:61181/login?next=%2Fapp%2Fuptime%3F_t%3D1634632252445 281 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:00:03]                 │
[00:00:03]                 │ debg browser[INFO] http://localhost:61181/bootstrap.js 41:19 "^ A single error about an inline script not firing due to content security policy is expected!"
[00:00:03]                 │ debg ... sleep(700) start
[00:00:04]                 │ debg ... sleep(700) end
[00:00:04]                 │ debg returned from get, calling refresh
[00:00:06]                 │ debg browser[INFO] http://localhost:61181/login?next=%2Fapp%2Fuptime%3F_t%3D1634632252445 281 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:00:06]                 │
[00:00:06]                 │ debg browser[INFO] http://localhost:61181/bootstrap.js 41:19 "^ A single error about an inline script not firing due to content security policy is expected!"
[00:00:07]                 │ debg currentUrl = http://localhost:61181/login?next=%2Fapp%2Fuptime%3F_t%3D1634632252445
[00:00:07]                 │          appUrl = http://localhost:61181/app/uptime
[00:00:07]                 │ debg TestSubjects.find(kibanaChrome)
[00:00:07]                 │ debg Find.findByCssSelector('[data-test-subj="kibanaChrome"]') with timeout=60000
[00:00:08]                 │ debg Found login page
[00:00:08]                 │ debg TestSubjects.setValue(loginUsername, test_user)
[00:00:08]                 │ debg TestSubjects.click(loginUsername)
[00:00:08]                 │ debg Find.clickByCssSelector('[data-test-subj="loginUsername"]') with timeout=10000
[00:00:08]                 │ debg Find.findByCssSelector('[data-test-subj="loginUsername"]') with timeout=10000
[00:00:08]                 │ warn browser[SEVERE] http://localhost:61181/api/alerts/list_alert_types - Failed to load resource: the server responded with a status of 401 (Unauthorized)
[00:00:08]                 │ debg browser[INFO] http://localhost:61181/47281/bundles/core/core.entry.js 7:106882 "Detected an unhandled Promise rejection.
[00:00:08]                 │      Error: Unauthorized"
[00:00:08]                 │ warn browser[SEVERE] http://localhost:61181/47281/bundles/core/core.entry.js 7:52880 
[00:00:08]                 │ warn browser[SEVERE] http://localhost:61181/api/licensing/info - Failed to load resource: the server responded with a status of 401 (Unauthorized)
[00:00:08]                 │ debg TestSubjects.setValue(loginPassword, changeme)
[00:00:08]                 │ debg TestSubjects.click(loginPassword)
[00:00:08]                 │ debg Find.clickByCssSelector('[data-test-subj="loginPassword"]') with timeout=10000
[00:00:08]                 │ debg Find.findByCssSelector('[data-test-subj="loginPassword"]') with timeout=10000
[00:00:08]                 │ debg TestSubjects.click(loginSubmit)
[00:00:08]                 │ debg Find.clickByCssSelector('[data-test-subj="loginSubmit"]') with timeout=10000
[00:00:08]                 │ debg Find.findByCssSelector('[data-test-subj="loginSubmit"]') with timeout=10000
[00:00:08]                 │ debg Find.waitForDeletedByCssSelector('.kibanaWelcomeLogo') with timeout=10000
[00:00:08]                 │ proc [kibana] [2021-10-19T08:30:57.727+00:00][INFO ][plugins.security.routes] Logging in with provider "basic" (basic)
[00:00:09]                 │ debg browser[INFO] http://localhost:61181/app/uptime?_t=1634632252445 281 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:00:09]                 │
[00:00:09]                 │ debg browser[INFO] http://localhost:61181/bootstrap.js 41:19 "^ A single error about an inline script not firing due to content security policy is expected!"
[00:00:09]                 │ debg Find.findByCssSelector('[data-test-subj="kibanaChrome"]') with timeout=60000
[00:00:12]                 │ debg Find.findByCssSelector('[data-test-subj="kibanaChrome"] nav:not(.ng-hide)') with timeout=60000
[00:00:12]                 │ info [o.e.c.m.MetadataMappingService] [node-01] [.kibana_8.0.0_001/--UMDcFxQxqAQMCU3wXy2A] update_mapping [_doc]
[00:00:13]                 │ debg browser[INFO] http://localhost:61181/app/uptime?_t=1634632260996 281 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:00:13]                 │
[00:00:13]                 │ debg browser[INFO] http://localhost:61181/bootstrap.js 41:19 "^ A single error about an inline script not firing due to content security policy is expected!"
[00:00:13]                 │ debg Finished login process currentUrl = http://localhost:61181/app/uptime
[00:00:13]                 │ debg ... sleep(501) start
[00:00:13]                 │ debg ... sleep(501) end
[00:00:14]                 │ debg in navigateTo url = http://localhost:61181/app/uptime
[00:00:14]                 │ debg isGlobalLoadingIndicatorVisible
[00:00:14]                 │ debg TestSubjects.exists(globalLoadingIndicator)
[00:00:14]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="globalLoadingIndicator"]') with timeout=1500
[00:00:15]                 │ debg TestSubjects.exists(globalLoadingIndicator-hidden)
[00:00:15]                 │ debg Find.existsByCssSelector('[data-test-subj="globalLoadingIndicator-hidden"]') with timeout=100000
[00:00:18]                 │ info [o.e.h.AbstractHttpServerTransport] [node-01] handling request [8fb86644-83bc-48a5-845e-034bdd738d91][POST][/_security/user/_has_privileges][Netty4HttpChannel{localAddress=/127.0.0.1:62181, remoteAddress=/127.0.0.1:36724}] took [7205ms] which is above the warn threshold of [5000ms]
[00:00:18]                 │ debg TestSubjects.exists(uptimeOverviewPage)
[00:00:18]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="uptimeOverviewPage"]') with timeout=2000
[00:00:18]                 │ debg TestSubjects.exists(superDatePickerToggleQuickMenuButton)
[00:00:18]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="superDatePickerToggleQuickMenuButton"]') with timeout=20000
[00:00:18]                 │ debg TestSubjects.exists(superDatePickerShowDatesButton)
[00:00:18]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="superDatePickerShowDatesButton"]') with timeout=2500
[00:00:18]                 │ debg TestSubjects.click(superDatePickerShowDatesButton)
[00:00:18]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerShowDatesButton"]') with timeout=10000
[00:00:18]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerShowDatesButton"]') with timeout=10000
[00:00:18]                 │ debg TestSubjects.exists(superDatePickerstartDatePopoverButton)
[00:00:18]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="superDatePickerstartDatePopoverButton"]') with timeout=2500
[00:00:18]                 │ debg TestSubjects.getVisibleText(superDatePickerstartDatePopoverButton)
[00:00:18]                 │ debg TestSubjects.find(superDatePickerstartDatePopoverButton)
[00:00:18]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerstartDatePopoverButton"]') with timeout=10000
[00:00:18]                 │ debg TestSubjects.getVisibleText(superDatePickerendDatePopoverButton)
[00:00:18]                 │ debg TestSubjects.find(superDatePickerendDatePopoverButton)
[00:00:18]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerendDatePopoverButton"]') with timeout=10000
[00:00:18]                 │ debg Setting absolute range to Sep 10, 2019 @ 12:40:08.078 to Sep 11, 2019 @ 19:40:08.078
[00:00:18]                 │ debg TestSubjects.exists(superDatePickerToggleQuickMenuButton)
[00:00:18]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="superDatePickerToggleQuickMenuButton"]') with timeout=20000
[00:00:19]                 │ debg TestSubjects.exists(superDatePickerShowDatesButton)
[00:00:19]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="superDatePickerShowDatesButton"]') with timeout=2500
[00:00:19]                 │ info [o.e.c.m.MetadataMappingService] [node-01] [.kibana_8.0.0_001/--UMDcFxQxqAQMCU3wXy2A] update_mapping [_doc]
[00:00:21]                 │ debg --- retry.tryForTime error: [data-test-subj="superDatePickerShowDatesButton"] is not displayed
[00:00:22]                 │ debg TestSubjects.exists(superDatePickerstartDatePopoverButton)
[00:00:22]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="superDatePickerstartDatePopoverButton"]') with timeout=2500
[00:00:22]                 │ debg Waiting up to 20000ms for endDate is set to Sep 11, 2019 @ 19:40:08.078...
[00:00:22]                 │ debg TestSubjects.click(superDatePickerendDatePopoverButton)
[00:00:22]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerendDatePopoverButton"]') with timeout=10000
[00:00:22]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerendDatePopoverButton"]') with timeout=10000
[00:00:22]                 │ debg Find.findByCssSelector('div.euiPopover__panel-isOpen') with timeout=10000
[00:00:22]                 │ debg TestSubjects.click(superDatePickerAbsoluteTab)
[00:00:22]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerAbsoluteTab"]') with timeout=10000
[00:00:22]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerAbsoluteTab"]') with timeout=10000
[00:00:22]                 │ debg TestSubjects.click(superDatePickerAbsoluteDateInput)
[00:00:22]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=10000
[00:00:22]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=10000
[00:00:22]                 │ debg TestSubjects.setValue(superDatePickerAbsoluteDateInput, Sep 11, 2019 @ 19:40:08.078)
[00:00:22]                 │ debg TestSubjects.click(superDatePickerAbsoluteDateInput)
[00:00:22]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=10000
[00:00:22]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=10000
[00:00:23]                 │ debg TestSubjects.getVisibleText(superDatePickerendDatePopoverButton)
[00:00:23]                 │ debg TestSubjects.find(superDatePickerendDatePopoverButton)
[00:00:23]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerendDatePopoverButton"]') with timeout=10000
[00:00:23]                 │ debg Validating 'endDate' - expected: 'Sep 11, 2019 @ 19:40:08.078, actual: Sep 11, 2019 @ 19:40:08.078'
[00:00:23]                 │ debg Waiting up to 20000ms for endDate is set to Sep 10, 2019 @ 12:40:08.078...
[00:00:23]                 │ debg TestSubjects.click(superDatePickerstartDatePopoverButton)
[00:00:23]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerstartDatePopoverButton"]') with timeout=10000
[00:00:23]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerstartDatePopoverButton"]') with timeout=10000
[00:00:23]                 │ debg Find.waitForElementStale with timeout=10000
[00:00:23]                 │ debg Find.findByCssSelector('div.euiPopover__panel-isOpen') with timeout=10000
[00:00:23]                 │ debg TestSubjects.click(superDatePickerAbsoluteTab)
[00:00:23]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerAbsoluteTab"]') with timeout=10000
[00:00:23]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerAbsoluteTab"]') with timeout=10000
[00:00:23]                 │ debg TestSubjects.click(superDatePickerAbsoluteDateInput)
[00:00:23]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=10000
[00:00:23]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=10000
[00:00:23]                 │ debg TestSubjects.setValue(superDatePickerAbsoluteDateInput, Sep 10, 2019 @ 12:40:08.078)
[00:00:23]                 │ debg TestSubjects.click(superDatePickerAbsoluteDateInput)
[00:00:23]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=10000
[00:00:23]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=10000
[00:00:24]                 │ debg TestSubjects.getVisibleText(superDatePickerstartDatePopoverButton)
[00:00:24]                 │ debg TestSubjects.find(superDatePickerstartDatePopoverButton)
[00:00:24]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerstartDatePopoverButton"]') with timeout=10000
[00:00:24]                 │ debg Validating 'startDate' - expected: 'Sep 10, 2019 @ 12:40:08.078, actual: Sep 10, 2019 @ 12:40:08.078'
[00:00:24]                 │ debg Waiting up to 20000ms for Timepicker popover to close...
[00:00:24]                 │ debg TestSubjects.exists(superDatePickerAbsoluteDateInput)
[00:00:24]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="superDatePickerAbsoluteDateInput"]') with timeout=2500
[00:00:24]                 │ debg --- retry.tryForTime error: [data-test-subj="superDatePickerAbsoluteDateInput"] is not displayed
[00:00:27]                 │ debg --- retry.tryForTime failed again with the same message...
[00:00:27]                 │ debg TestSubjects.exists(superDatePickerApplyTimeButton)
[00:00:27]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="superDatePickerApplyTimeButton"]') with timeout=2500
[00:00:27]                 │ debg TestSubjects.click(superDatePickerApplyTimeButton)
[00:00:27]                 │ debg Find.clickByCssSelector('[data-test-subj="superDatePickerApplyTimeButton"]') with timeout=10000
[00:00:27]                 │ debg Find.findByCssSelector('[data-test-subj="superDatePickerApplyTimeButton"]') with timeout=10000
[00:00:27]                 │ debg Find.waitForElementStale with timeout=10000
[00:00:28]                 │ debg TestSubjects.exists(globalLoadingIndicator-hidden)
[00:00:28]                 │ debg Find.existsByCssSelector('[data-test-subj="globalLoadingIndicator-hidden"]') with timeout=100000
[00:00:28]                 │ debg isGlobalLoadingIndicatorVisible
[00:00:28]                 │ debg TestSubjects.exists(globalLoadingIndicator)
[00:00:28]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="globalLoadingIndicator"]') with timeout=1500
[00:00:29]                 │ debg --- retry.tryForTime error: [data-test-subj="globalLoadingIndicator"] is not displayed
[00:00:30]                 │ debg TestSubjects.exists(globalLoadingIndicator-hidden)
[00:00:30]                 │ debg Find.existsByCssSelector('[data-test-subj="globalLoadingIndicator-hidden"]') with timeout=100000
[00:00:30]                 │ debg TestSubjects.click(xpack.uptime.alertsPopover.toggleButton)
[00:00:30]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alertsPopover.toggleButton"]') with timeout=10000
[00:00:30]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alertsPopover.toggleButton"]') with timeout=10000
[00:00:30]                 │ debg TestSubjects.click(xpack.uptime.openAlertContextPanel)
[00:00:30]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.openAlertContextPanel"]') with timeout=10000
[00:00:30]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.openAlertContextPanel"]') with timeout=10000
[00:00:30]                 │ debg TestSubjects.click(xpack.uptime.toggleAlertFlyout)
[00:00:30]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.toggleAlertFlyout"]') with timeout=10000
[00:00:30]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.toggleAlertFlyout"]') with timeout=10000
[00:00:30]                 │ debg TestSubjects.exists(alertNameInput)
[00:00:30]                 │ debg Find.existsByDisplayedByCssSelector('[data-test-subj="alertNameInput"]') with timeout=2500
[00:00:30]                 └- ✓ pass  (27.9s)
[00:00:30]               └-> can set alert name
[00:00:30]                 └-> "before each" hook: global before each for "can set alert name"
[00:00:30]                 │ debg TestSubjects.setValue(alertNameInput, uptime-test)
[00:00:30]                 │ debg TestSubjects.click(alertNameInput)
[00:00:30]                 │ debg Find.clickByCssSelector('[data-test-subj="alertNameInput"]') with timeout=10000
[00:00:30]                 │ debg Find.findByCssSelector('[data-test-subj="alertNameInput"]') with timeout=10000
[00:00:31]                 └- ✓ pass  (664ms)
[00:00:31]               └-> can set alert tags
[00:00:31]                 └-> "before each" hook: global before each for "can set alert tags"
[00:00:31]                 │ debg TestSubjects.click(comboBoxSearchInput)
[00:00:31]                 │ debg Find.clickByCssSelector('[data-test-subj="comboBoxSearchInput"]') with timeout=10000
[00:00:31]                 │ debg Find.findByCssSelector('[data-test-subj="comboBoxSearchInput"]') with timeout=10000
[00:00:31]                 │ debg TestSubjects.setValue(comboBoxInput, uptime)
[00:00:31]                 │ debg TestSubjects.click(comboBoxInput)
[00:00:31]                 │ debg Find.clickByCssSelector('[data-test-subj="comboBoxInput"]') with timeout=10000
[00:00:31]                 │ debg Find.findByCssSelector('[data-test-subj="comboBoxInput"]') with timeout=10000
[00:00:32]                 │ debg TestSubjects.click(comboBoxSearchInput)
[00:00:32]                 │ debg Find.clickByCssSelector('[data-test-subj="comboBoxSearchInput"]') with timeout=10000
[00:00:32]                 │ debg Find.findByCssSelector('[data-test-subj="comboBoxSearchInput"]') with timeout=10000
[00:00:32]                 │ debg TestSubjects.setValue(comboBoxInput, another)
[00:00:32]                 │ debg TestSubjects.click(comboBoxInput)
[00:00:32]                 │ debg Find.clickByCssSelector('[data-test-subj="comboBoxInput"]') with timeout=10000
[00:00:32]                 │ debg Find.findByCssSelector('[data-test-subj="comboBoxInput"]') with timeout=10000
[00:00:33]                 └- ✓ pass  (1.4s)
[00:00:33]               └-> can set alert interval
[00:00:33]                 └-> "before each" hook: global before each for "can set alert interval"
[00:00:33]                 │ debg TestSubjects.setValue(intervalInput, 11)
[00:00:33]                 │ debg TestSubjects.click(intervalInput)
[00:00:33]                 │ debg Find.clickByCssSelector('[data-test-subj="intervalInput"]') with timeout=10000
[00:00:33]                 │ debg Find.findByCssSelector('[data-test-subj="intervalInput"]') with timeout=10000
[00:00:33]                 └- ✓ pass  (496ms)
[00:00:33]               └-> can set alert throttle interval
[00:00:33]                 └-> "before each" hook: global before each for "can set alert throttle interval"
[00:00:33]                 │ debg TestSubjects.click(notifyWhenSelect)
[00:00:33]                 │ debg Find.clickByCssSelector('[data-test-subj="notifyWhenSelect"]') with timeout=10000
[00:00:33]                 │ debg Find.findByCssSelector('[data-test-subj="notifyWhenSelect"]') with timeout=10000
[00:00:33]                 │ debg TestSubjects.click(onThrottleInterval)
[00:00:33]                 │ debg Find.clickByCssSelector('[data-test-subj="onThrottleInterval"]') with timeout=10000
[00:00:33]                 │ debg Find.findByCssSelector('[data-test-subj="onThrottleInterval"]') with timeout=10000
[00:00:34]                 │ debg TestSubjects.setValue(throttleInput, 30)
[00:00:34]                 │ debg TestSubjects.click(throttleInput)
[00:00:34]                 │ debg Find.clickByCssSelector('[data-test-subj="throttleInput"]') with timeout=10000
[00:00:34]                 │ debg Find.findByCssSelector('[data-test-subj="throttleInput"]') with timeout=10000
[00:00:35]                 └- ✓ pass  (1.4s)
[00:00:35]               └-> can set alert status number of time
[00:00:35]                 └-> "before each" hook: global before each for "can set alert status number of time"
[00:00:35]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.numTimesExpression)
[00:00:35]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.numTimesExpression"]') with timeout=10000
[00:00:35]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.numTimesExpression"]') with timeout=10000
[00:00:35]                 │ debg TestSubjects.setValue(xpack.uptime.alerts.monitorStatus.numTimesField, 3)
[00:00:35]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.numTimesField)
[00:00:35]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.numTimesField"]') with timeout=10000
[00:00:35]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.numTimesField"]') with timeout=10000
[00:00:35]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.numTimesExpression)
[00:00:35]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.numTimesExpression"]') with timeout=10000
[00:00:35]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.numTimesExpression"]') with timeout=10000
[00:00:35]                 └- ✓ pass  (691ms)
[00:00:35]               └-> can set alert time range
[00:00:35]                 └-> "before each" hook: global before each for "can set alert time range"
[00:00:35]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.timerangeValueExpression)
[00:00:35]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeValueExpression"]') with timeout=10000
[00:00:35]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeValueExpression"]') with timeout=10000
[00:00:35]                 │ debg TestSubjects.setValue(xpack.uptime.alerts.monitorStatus.timerangeValueField, 1)
[00:00:35]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.timerangeValueField)
[00:00:35]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeValueField"]') with timeout=10000
[00:00:35]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeValueField"]') with timeout=10000
[00:00:36]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.timerangeValueExpression)
[00:00:36]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeValueExpression"]') with timeout=10000
[00:00:36]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeValueExpression"]') with timeout=10000
[00:00:36]                 └- ✓ pass  (923ms)
[00:00:36]               └-> can set monitor hours
[00:00:36]                 └-> "before each" hook: global before each for "can set monitor hours"
[00:00:36]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.timerangeUnitExpression)
[00:00:36]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeUnitExpression"]') with timeout=10000
[00:00:36]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeUnitExpression"]') with timeout=10000
[00:00:36]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.timerangeUnitSelectable)
[00:00:36]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeUnitSelectable"]') with timeout=10000
[00:00:36]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeUnitSelectable"]') with timeout=10000
[00:00:37]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.timerangeUnitSelectable.hoursOption)
[00:00:37]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeUnitSelectable.hoursOption"]') with timeout=10000
[00:00:37]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeUnitSelectable.hoursOption"]') with timeout=10000
[00:00:37]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.timerangeUnitExpression)
[00:00:37]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeUnitExpression"]') with timeout=10000
[00:00:37]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.timerangeUnitExpression"]') with timeout=10000
[00:00:37]                 └- ✓ pass  (925ms)
[00:00:37]               └-> can set kuery bar filters
[00:00:37]                 └-> "before each" hook: global before each for "can set kuery bar filters"
[00:00:37]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.filterBar)
[00:00:37]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.filterBar"]') with timeout=10000
[00:00:37]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.filterBar"]') with timeout=10000
[00:00:37]                 │ debg TestSubjects.setValue(xpack.uptime.alerts.monitorStatus.filterBar, monitor.id: "0001-up")
[00:00:37]                 │ debg TestSubjects.click(xpack.uptime.alerts.monitorStatus.filterBar)
[00:00:37]                 │ debg Find.clickByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.filterBar"]') with timeout=10000
[00:00:37]                 │ debg Find.findByCssSelector('[data-test-subj="xpack.uptime.alerts.monitorStatus.filterBar"]') with timeout=10000
[00:00:41]                 └- ✓ pass  (3.5s)
[00:00:41]               └-> can select location filter
[00:00:41]                 └-> "before each" hook: global before each for "can select location filter"
[00:00:41]                 │ debg TestSubjects.click(uptimeCreateAlertAddFilter)
[00:00:41]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeCreateAlertAddFilter"]') with timeout=10000
[00:00:41]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeCreateAlertAddFilter"]') with timeout=10000
[00:00:41]                 │ debg TestSubjects.click(uptimeAlertAddFilter.observer.geo.name)
[00:00:41]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeAlertAddFilter.observer.geo.name"]') with timeout=10000
[00:00:41]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeAlertAddFilter.observer.geo.name"]') with timeout=10000
[00:00:41]                 │ debg TestSubjects.click(uptimeCreateStatusAlert.filter_location)
[00:00:41]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeCreateStatusAlert.filter_location"]') with timeout=10000
[00:00:41]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeCreateStatusAlert.filter_location"]') with timeout=10000
[00:00:41]                 │ debg Find.clickByCssSelector('li[title="mpls"]') with timeout=10000
[00:00:41]                 │ debg Find.findByCssSelector('li[title="mpls"]') with timeout=10000
[00:00:41]                 │ debg Find.findByCssSelector('[aria-label="Apply the selected filters for Location"]') with timeout=10000
[00:00:42]                 └- ✓ pass  (1.1s)
[00:00:42]               └-> can select port filter
[00:00:42]                 └-> "before each" hook: global before each for "can select port filter"
[00:00:42]                 │ debg TestSubjects.click(uptimeCreateAlertAddFilter)
[00:00:42]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeCreateAlertAddFilter"]') with timeout=10000
[00:00:42]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeCreateAlertAddFilter"]') with timeout=10000
[00:00:42]                 │ debg TestSubjects.click(uptimeAlertAddFilter.url.port)
[00:00:42]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeAlertAddFilter.url.port"]') with timeout=10000
[00:00:42]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeAlertAddFilter.url.port"]') with timeout=10000
[00:00:42]                 │ debg TestSubjects.click(uptimeCreateStatusAlert.filter_port)
[00:00:42]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeCreateStatusAlert.filter_port"]') with timeout=10000
[00:00:42]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeCreateStatusAlert.filter_port"]') with timeout=10000
[00:00:42]                 │ debg Find.clickByCssSelector('li[title="5678"]') with timeout=10000
[00:00:42]                 │ debg Find.findByCssSelector('li[title="5678"]') with timeout=10000
[00:00:42]                 │ debg Find.findByCssSelector('[aria-label="Apply the selected filters for Port"]') with timeout=10000
[00:00:43]                 └- ✓ pass  (1.1s)
[00:00:43]               └-> can select type/scheme filter
[00:00:43]                 └-> "before each" hook: global before each for "can select type/scheme filter"
[00:00:43]                 │ debg TestSubjects.click(uptimeCreateAlertAddFilter)
[00:00:43]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeCreateAlertAddFilter"]') with timeout=10000
[00:00:43]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeCreateAlertAddFilter"]') with timeout=10000
[00:00:43]                 │ debg TestSubjects.click(uptimeAlertAddFilter.monitor.type)
[00:00:43]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeAlertAddFilter.monitor.type"]') with timeout=10000
[00:00:43]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeAlertAddFilter.monitor.type"]') with timeout=10000
[00:00:43]                 │ debg TestSubjects.click(uptimeCreateStatusAlert.filter_scheme)
[00:00:43]                 │ debg Find.clickByCssSelector('[data-test-subj="uptimeCreateStatusAlert.filter_scheme"]') with timeout=10000
[00:00:43]                 │ debg Find.findByCssSelector('[data-test-subj="uptimeCreateStatusAlert.filter_scheme"]') with timeout=10000
[00:00:43]                 │ debg Find.clickByCssSelector('li[title="http"]') with timeout=10000
[00:00:43]                 │ debg Find.findByCssSelector('li[title="http"]') with timeout=10000
[00:00:43]                 │ debg Find.findByCssSelector('[aria-label="Apply the selected filters for Scheme"]') with timeout=10000
[00:00:44]                 └- ✓ pass  (1.0s)
[00:00:44]               └-> can save alert
[00:00:44]                 └-> "before each" hook: global before each for "can save alert"
[00:00:44]                 │ debg TestSubjects.click(saveAlertButton)
[00:00:44]                 │ debg Find.clickByCssSelector('[data-test-subj="saveAlertButton"]') with timeout=10000
[00:00:44]                 │ debg Find.findByCssSelector('[data-test-subj="saveAlertButton"]') with timeout=10000
[00:00:44]                 │ debg TestSubjects.click(confirmAlertSaveModal > confirmModalConfirmButton)
[00:00:44]                 │ debg Find.clickByCssSelector('[data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"]') with timeout=20000
[00:00:44]                 │ debg Find.findByCssSelector('[data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"]') with timeout=20000
[00:01:04]                 │ debg --- retry.try error: Waiting for element to be located By(css selector, [data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"])
[00:01:04]                 │      Wait timed out after 20249ms
[00:01:05]                 │ debg Find.findByCssSelector('[data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"]') with timeout=20000
[00:01:25]                 │ debg --- retry.try error: Waiting for element to be located By(css selector, [data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"])
[00:01:25]                 │      Wait timed out after 20263ms
[00:01:26]                 │ debg Find.findByCssSelector('[data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"]') with timeout=20000
[00:01:46]                 │ debg --- retry.try error: Waiting for element to be located By(css selector, [data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"])
[00:01:46]                 │      Wait timed out after 20269ms
[00:01:46]                 │ debg Find.findByCssSelector('[data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"]') with timeout=20000
[00:02:07]                 │ debg --- retry.try error: Waiting for element to be located By(css selector, [data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"])
[00:02:07]                 │      Wait timed out after 20295ms
[00:02:07]                 │ debg Find.findByCssSelector('[data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"]') with timeout=20000
[00:02:28]                 │ debg --- retry.try error: Waiting for element to be located By(css selector, [data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"])
[00:02:28]                 │      Wait timed out after 20503ms
[00:02:28]                 │ debg Find.findByCssSelector('[data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"]') with timeout=20000
[00:02:49]                 │ debg --- retry.try error: Waiting for element to be located By(css selector, [data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"])
[00:02:49]                 │      Wait timed out after 20284ms
[00:02:49]                 │ info Taking screenshot "/dev/shm/workspace/parallel/18/kibana/x-pack/test/functional/screenshots/failure/Uptime app with real-world data uptime alerts overview page alert flyout controls can save alert.png"
[00:02:49]                 │ info Current URL is: http://localhost:61181/app/uptime?dateRangeEnd=2019-09-11T19%3A40%3A08.078Z&dateRangeStart=2019-09-10T12%3A40%3A08.078Z
[00:02:49]                 │ info Saving page source to: /dev/shm/workspace/parallel/18/kibana/x-pack/test/functional/failure_debug/html/Uptime app with real-world data uptime alerts overview page alert flyout controls can save alert.html
[00:02:49]                 └- ✖ fail: Uptime app with real-world data uptime alerts overview page alert flyout controls can save alert
[00:02:49]                 │      Error: retry.try timeout: TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"])
[00:02:49]                 │ Wait timed out after 20284ms
[00:02:49]                 │     at /dev/shm/workspace/parallel/18/kibana/node_modules/selenium-webdriver/lib/webdriver.js:842:17
[00:02:49]                 │     at runMicrotasks (<anonymous>)
[00:02:49]                 │     at processTicksAndRejections (node:internal/process/task_queues:96:5)
[00:02:49]                 │       at onFailure (/dev/shm/workspace/parallel/18/kibana/test/common/services/retry/retry_for_success.ts:17:9)
[00:02:49]                 │       at retryForSuccess (/dev/shm/workspace/parallel/18/kibana/test/common/services/retry/retry_for_success.ts:59:13)
[00:02:49]                 │       at RetryService.try (/dev/shm/workspace/parallel/18/kibana/test/common/services/retry/retry.ts:31:12)
[00:02:49]                 │       at Proxy.clickByCssSelector (/dev/shm/workspace/parallel/18/kibana/test/functional/services/common/find.ts:368:5)
[00:02:49]                 │       at TestSubjects.click (/dev/shm/workspace/parallel/18/kibana/test/functional/services/common/test_subjects.ts:105:5)
[00:02:49]                 │       at Object.clickSaveAlertsConfirmButton (test/functional/services/uptime/alerts.ts:111:7)
[00:02:49]                 │       at Context.<anonymous> (test/functional_with_es_ssl/apps/uptime/alert_flyout.ts:91:9)
[00:02:49]                 │       at Object.apply (/dev/shm/workspace/parallel/18/kibana/node_modules/@kbn/test/target_node/functional_test_runner/lib/mocha/wrap_function.js:87:16)
[00:02:49]                 │ 
[00:02:49]                 │ 

Stack Trace

Error: retry.try timeout: TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="confirmAlertSaveModal"] [data-test-subj="confirmModalConfirmButton"])
Wait timed out after 20284ms
    at /dev/shm/workspace/parallel/18/kibana/node_modules/selenium-webdriver/lib/webdriver.js:842:17
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at onFailure (/dev/shm/workspace/parallel/18/kibana/test/common/services/retry/retry_for_success.ts:17:9)
    at retryForSuccess (/dev/shm/workspace/parallel/18/kibana/test/common/services/retry/retry_for_success.ts:59:13)
    at RetryService.try (/dev/shm/workspace/parallel/18/kibana/test/common/services/retry/retry.ts:31:12)
    at Proxy.clickByCssSelector (/dev/shm/workspace/parallel/18/kibana/test/functional/services/common/find.ts:368:5)
    at TestSubjects.click (/dev/shm/workspace/parallel/18/kibana/test/functional/services/common/test_subjects.ts:105:5)
    at Object.clickSaveAlertsConfirmButton (test/functional/services/uptime/alerts.ts:111:7)
    at Context.<anonymous> (test/functional_with_es_ssl/apps/uptime/alert_flyout.ts:91:9)
    at Object.apply (/dev/shm/workspace/parallel/18/kibana/node_modules/@kbn/test/target_node/functional_test_runner/lib/mocha/wrap_function.js:87:16)

Metrics [docs]

Public APIs missing comments

Total count of every public API that lacks a comment. Target amount is 0. Run node scripts/build_api_docs --plugin [yourplugin] --stats comments for more detailed information.

id before after diff
securitySolution 1307 1308 +1
timelines 847 848 +1
total +2

Async chunks

Total size of all lazy-loaded chunks that will be downloaded as the user navigates the app

id before after diff
securitySolution 4.6MB 4.6MB +109.0B
Unknown metric groups

API count

id before after diff
securitySolution 1361 1362 +1
timelines 968 969 +1
total +2

History

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

cc @andrew-goldstein

@andrew-goldstein andrew-goldstein merged commit f9afe67 into elastic:master Oct 19, 2021
kibanamachine pushed a commit to kibanamachine/kibana that referenced this pull request Oct 19, 2021
…in the Event and Alert Details panels (elastic#115141)

## [Security Solution] Improves the formatting of array values and JSON in the Event and Alert Details panels

This PR improves the formatting of array values and JSON in the Event and Alert details panels by:

- in the `Table` tab, formatting array values such that each value appears on a separate line, (instead of joining the values on a single line)
- in the `JSON` tab, displaying the raw search hit JSON, instead displaying a JSON representation based on the `Fields` API

### Table value formatting

In the Event and Alert details `Table` tab, array values were joined on a single line, as shown in the _before_ screenshot below:

![event-details-value-formatting-before](https://user-images.githubusercontent.com/4459398/137524968-6450cd73-3154-457d-b850-32a3e7faaab2.png)

_Above: (before) array values were joined on a single line_

Array values are now formatted such that each value appears on a separate line, as shown in the _after_ screenshot below:

![event-details-value-formatting-after](https://user-images.githubusercontent.com/4459398/137436705-b0bec735-5a83-402e-843a-2776e1c80da9.png)

_Above: (after) array values each appear on a separte line_

### JSON formatting

The `JSON` tab previously displayed a JSON representation based on the `Fields` API. Array values were previously represented as a joined string, as shown in the _before_ screenshot below:

![event-details-json-formatting-before](https://user-images.githubusercontent.com/4459398/137525039-d1b14f21-5f9c-4201-905e-8b08f00bb5a0.png)

_Above: (before) array values were previously represented as a joined string_

The `JSON` tab now displays the raw search hit JSON, per the _after_ screenshot below:

![event-details-json-formatting-after](https://user-images.githubusercontent.com/4459398/137437257-330c5b49-a4ad-418e-a976-923f7a35c0cf.png)

_Above: (after) the `JSON` tab displays the raw search hit_

CC @monina-n @paulewing
@kibanamachine
Copy link
Contributor

💚 Backport successful

Status Branch Result
7.x

This backport PR will be merged automatically after passing CI.

@andrew-goldstein andrew-goldstein deleted the array-value-and-json-formatting-improvements branch October 19, 2021 15:27
kibanamachine added a commit that referenced this pull request Oct 19, 2021
…in the Event and Alert Details panels (#115141) (#115532)

## [Security Solution] Improves the formatting of array values and JSON in the Event and Alert Details panels

This PR improves the formatting of array values and JSON in the Event and Alert details panels by:

- in the `Table` tab, formatting array values such that each value appears on a separate line, (instead of joining the values on a single line)
- in the `JSON` tab, displaying the raw search hit JSON, instead displaying a JSON representation based on the `Fields` API

### Table value formatting

In the Event and Alert details `Table` tab, array values were joined on a single line, as shown in the _before_ screenshot below:

![event-details-value-formatting-before](https://user-images.githubusercontent.com/4459398/137524968-6450cd73-3154-457d-b850-32a3e7faaab2.png)

_Above: (before) array values were joined on a single line_

Array values are now formatted such that each value appears on a separate line, as shown in the _after_ screenshot below:

![event-details-value-formatting-after](https://user-images.githubusercontent.com/4459398/137436705-b0bec735-5a83-402e-843a-2776e1c80da9.png)

_Above: (after) array values each appear on a separte line_

### JSON formatting

The `JSON` tab previously displayed a JSON representation based on the `Fields` API. Array values were previously represented as a joined string, as shown in the _before_ screenshot below:

![event-details-json-formatting-before](https://user-images.githubusercontent.com/4459398/137525039-d1b14f21-5f9c-4201-905e-8b08f00bb5a0.png)

_Above: (before) array values were previously represented as a joined string_

The `JSON` tab now displays the raw search hit JSON, per the _after_ screenshot below:

![event-details-json-formatting-after](https://user-images.githubusercontent.com/4459398/137437257-330c5b49-a4ad-418e-a976-923f7a35c0cf.png)

_Above: (after) the `JSON` tab displays the raw search hit_

CC @monina-n @paulewing

Co-authored-by: Andrew Goldstein <[email protected]>
@timroes timroes added Team:Threat Hunting Security Solution Threat Hunting Team and removed Team:Threat Hunting Security Solution Threat Hunting Team labels Oct 27, 2021
@elastic elastic deleted a comment from elasticmachine Oct 27, 2021
@KOTungseth KOTungseth added the Feature:Detection Alerts Security Solution Detection Alerts Feature label Nov 19, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
auto-backport Deprecated - use backport:version if exact versions are needed Feature:Detection Alerts Security Solution Detection Alerts Feature release_note:enhancement Team:Threat Hunting:Investigations Security Solution Investigations Team v7.16.0 v8.0.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants