diff --git a/package.json b/package.json index 3aba7dff7e0ab..eba82cec0f02a 100644 --- a/package.json +++ b/package.json @@ -311,7 +311,7 @@ "proxy-from-env": "1.0.0", "proxyquire": "1.8.0", "puid": "1.0.7", - "puppeteer": "npm:@elastic/puppeteer@5.4.1-patch.1", + "puppeteer": "^8.0.0", "query-string": "^6.13.2", "raw-loader": "^3.1.0", "rbush": "^3.0.1", @@ -583,7 +583,6 @@ "@types/pretty-ms": "^5.0.0", "@types/prop-types": "^15.7.3", "@types/proper-lockfile": "^3.0.1", - "@types/puppeteer": "^5.4.1", "@types/rbush": "^3.0.0", "@types/reach__router": "^1.2.6", "@types/react": "^16.9.36", diff --git a/x-pack/build_chromium/README.md b/x-pack/build_chromium/README.md index b91f3f3a3c1ad..efa4d8eaa5cfc 100644 --- a/x-pack/build_chromium/README.md +++ b/x-pack/build_chromium/README.md @@ -3,37 +3,24 @@ We ship our own headless build of Chromium which is significantly smaller than the standard binaries shipped by Google. The scripts in this folder can be used to accept a commit hash from the Chromium repository, and initialize the build -environments and run the build on Mac, Windows, and Linux. +on Ubuntu Linux. -## Before you begin +## Why do we do this -If you wish to use a remote VM to build, you'll need access to our GCP account, -which is where we have two machines provisioned for the Linux and Windows -builds. Mac builds can be achieved locally, and are a great place to start to -gain familiarity. +By default, Puppeteer will download a zip file containing the Chromium browser for any +OS. This creates problems on Linux, because Chromium has a dependency on X11, which +is often not installed for a server environment. We don't want to make a requirement +for Linux that you need X11 to run Kibana. To work around this, we create our own Chromium +build, using the +[`headless_shell`](https://chromium.googlesource.com/chromium/src/+/5cf4b8b13ed518472038170f8de9db2f6c258fe4/headless) +build target. There are no (trustworthy) sources of these builds available elsewhere. -**NOTE:** Linux builds should be done in Ubuntu on x64 architecture. ARM builds -are created in x64 using cross-compiling. CentOS is not supported for building Chromium. - -1. Login to our GCP instance [here using your okta credentials](https://console.cloud.google.com/). -2. Click the "Compute Engine" tab. -3. Find `chromium-build-linux` or `chromium-build-windows-12-beefy` and start the instance. -4. Install [Google Cloud SDK](https://cloud.google.com/sdk) locally to ssh into the GCP instance -5. System dependencies: - - 8 CPU - - 30GB memory - - 80GB free space on disk (Try `ncdu /home` to see where space is used.) - - git - - python2 (`python` must link to `python2`) - - lsb_release - - tmux is recommended in case your ssh session is interrupted - - "Cloud API access scopes": must have **read / write** scope for the Storage API -6. Copy the entire `build_chromium` directory from the `headless_shell_staging` bucket. To do this, use `gsutil rsync`: - ```sh - # This shows a preview of what would change by synchronizing the source scripts with the destination GCS bucket. - # Remove the `-n` flag to enact the changes - gsutil -m rsync -n -r x-pack/build_chromium gs://headless_shell_staging/build_chromium - ``` +Fortunately, creating the custom builds is only necessary for Linux. When you have a build +of Kibana for Linux, or if you use a Linux desktop to develop Kibana, you have a copy of +`headless_shell` bundled inside. When you have a Windows or Mac build of Kibana, or use +either of those for development, you have a copy of the full build of Chromium, which +was downloaded from the main [Chromium download +location](https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html). ## Build Script Usage @@ -63,161 +50,65 @@ the Chromium repo to be cloned successfully. If checking out the Chromium fails with "early EOF" errors, the instance could be low on memory or disk space. ## Getting the Commit Hash + If you need to bump the version of Puppeteer, you need to get a new git commit hash for Chromium that corresponds to the Puppeteer version. ``` node x-pack/dev-tools/chromium_version.js [PuppeteerVersion] ``` -When bumping the Puppeteer version, make sure you also update the `.chromium-commit` file with the commit hash -for the current Chromium build, so we'll be able to construct a build pipeline for each OS (coming soon!). +When bumping the Puppeteer version, make sure you also update the `ChromiumArchivePaths.revision` variable in +`x-pack/plugins/reporting/server/browsers/chromium/paths.ts`. ## Build args A good how-to on building Chromium from source is [here](https://chromium.googlesource.com/chromium/src/+/master/docs/get_the_code.md). -There are documents for each OS that will explain how to customize arguments -for the build using the `gn` tool. Those instructions do not apply for the -Kibana Chromium build. Our `build.py` script ensure the correct `args.gn` -file gets used for build arguments. - -We have an `args.gn` file per platform: - -- mac: `darwin/args.gn` -- linux 64bit: `linux-x64/args.gn` -- windows: `windows/args.gn` -- ARM 64bit: linux-aarch64/args.gn +We have an `linux/args.gn` file that is automatically copied to the build target directory. To get a list of the build arguments that are enabled, install `depot_tools` and run `gn args out/headless --list`. It prints out all of the flags and their -settings, including the defaults. - -The various build flags are not well documented. Some are documented -[here](https://www.chromium.org/developers/gn-build-configuration). - -As of this writing, there is an officially supported headless Chromium build -args file for Linux: `build/args/headless.gn`. This does not work on Windows or -Mac, so we have taken that as our starting point, and modified it until the -Windows / Mac builds succeeded. +settings, including the defaults. Some build flags are documented +[here](https://www.chromium.org/developers/gn-build-configuration). **NOTE:** Please, make sure you consult @elastic/kibana-security before you change, remove or add any of the build flags. -## Building locally - -You can skip the step of running `/init.sh` for your OS if you already -have your environment set up, and the chromium source cloned. - -To get the Chromium code, refer to the [documentation](https://chromium.googlesource.com/chromium/src/+/master/docs/get_the_code.md). -Install `depot_tools` as suggested, since it comes with useful scripts. Use the -`fetch` command to clone the chromium repository. To set up and run the build, -use the Kibana `build.py` script (in this directory). - -It's recommended that you create a working directory for the chromium source -code and all the build tools, and run the commands from there: -```sh -mkdir ~/chromium && cd ~/chromium -cp -r ~/path/to/kibana/x-pack/build_chromium . -python ./build_chromium/init.sh [arch_name] -python ./build_chromium/build.py -``` - -## VMs - -I ran Linux and Windows VMs in GCP with the following specs: - -- 8 core vCPU -- 30GB RAM -- 128GB hard drive -- Ubuntu 18.04 LTS (not minimal) -- Windows Server 2016 (full, with desktop) - -The more cores the better, as the build makes effective use of each. For Linux, Ubuntu is the only officially supported build target. - -- Linux: - - SSH in using [gcloud](https://cloud.google.com/sdk/) - - Get the ssh command in the [GCP console](https://console.cloud.google.com/) -> VM instances -> your-vm-name -> SSH -> "View gcloud command" - - Their in-browser UI is kinda sluggish, so use the commandline tool (Google Cloud SDK is required) - -- Windows: - - Install Microsoft's Remote Desktop tools - - Get the RDP file in the [GCP console](https://console.cloud.google.com/) -> VM instances -> your-vm-name -> RDP -> Download the RDP file - - Edit it in Microsoft Remote Desktop: - - Display -> Resolution (1280 x 960 or something reasonable) - - Local Resources -> Folders, then select the folder(s) you want to share, this is at least `build_chromium` folder - - Save - -## Initializing each VM / environment +## Directions for Elasticians -In a VM, you'll want to use the init scripts to initialize each environment. -On Mac OS you'll need to install XCode and accept the license agreement. +If you wish to use a remote VM to build, you'll need access to our GCP account. -Create the build folder: - -- Mac / Linux: `mkdir -p ~/chromium` -- Windows: `mkdir c:\chromium` - -Copy the `x-pack/build-chromium` folder to each. Replace `you@your-machine` with the correct username and VM name: - -- Mac: `cp -r x-pack/build_chromium ~/chromium/build_chromium` -- Linux: `gcloud compute scp --recurse x-pack/build_chromium you@your-machine:~/chromium/ --zone=us-east1-b --project "XXXXXXXX"` -- Windows: Copy the `build_chromium` folder via the RDP GUI into `c:\chromium\build_chromium` - -There is an init script for each platform. This downloads and installs the necessary prerequisites, sets environment variables, etc. - -- Mac x64: `~/chromium/build_chromium/darwin/init.sh` -- Linux x64: `~/chromium/build_chromium/linux/init.sh` -- Linux arm64: `~/chromium/build_chromium/linux/init.sh arm64` -- Windows x64: `c:\chromium\build_chromium\windows\init.bat` - -In windows, at least, you will need to do a number of extra steps: - -- Follow the prompts in the Visual Studio installation process, click "Install" and wait a while -- Once it's installed, open Control Panel and turn on Debugging Tools for Windows: - - Control Panel → Programs → Programs and Features → Select the “Windows Software Development Kit” → Change → Change → Check “Debugging Tools For Windows” → Change -- Press enter in the terminal to continue running the init - -## Building - -Note: In Linux, you should run the build command in tmux so that if your ssh session disconnects, the build can keep going. To do this, just type `tmux` into your terminal to hop into a tmux session. If you get disconnected, you can hop back in like so: - -- SSH into the server -- Run `tmux list-sessions` -- Run `tmux switch -t {session_id}`, replacing {session_id} with the value from the list-sessions output - -To run the build, replace the sha in the following commands with the sha that you wish to build: +**NOTE:** The builds should be done in Ubuntu on x64 architecture. ARM builds +are created in x64 using cross-compiling. CentOS is not supported for building Chromium. -- Mac x64: `python ~/chromium/build_chromium/build.py 312d84c8ce62810976feda0d3457108a6dfff9e6` -- Linux x64: `python ~/chromium/build_chromium/build.py 312d84c8ce62810976feda0d3457108a6dfff9e6` -- Linux arm64: `python ~/chromium/build_chromium/build.py 312d84c8ce62810976feda0d3457108a6dfff9e6 arm64` -- Windows x64: `python c:\chromium\build_chromium\build.py 312d84c8ce62810976feda0d3457108a6dfff9e6` +1. Login to Google Cloud Console +2. Click the "Compute Engine" tab. +3. Create a Linux VM: + - 8 CPU + - 30GB memory + - 80GB free space on disk (Try `ncdu /home` to see where space is used.) + - git + - python2 (`python` must link to `python2`) + - lsb_release + - tmux is recommended in case your ssh session is interrupted + - "Cloud API access scopes": must have **read / write** scope for the Storage API +4. Install [Google Cloud SDK](https://cloud.google.com/sdk) locally to ssh into the GCP instance ## Artifacts After the build completes, there will be a .zip file and a .md5 file in `~/chromium/chromium/src/out/headless`. These are named like so: `chromium-{first_7_of_SHA}-{platform}-{arch}`, for example: `chromium-4747cc2-linux-x64`. +The zip files and md5 files are copied to a staging bucket in GCP storage. -The zip files need to be deployed to GCP Storage. For testing, I drop them into `headless-shell-dev`, but for production, they need to be in `headless-shell`. And the `x-pack/plugins/reporting/server/browsers/chromium/paths.ts` file needs to be upated to have the correct `archiveChecksum`, `archiveFilename`, `binaryChecksum` and `baseUrl`. Below is a list of what the archive's are: - -- `archiveChecksum`: The contents of the `.md5` file, which is the `md5` checksum of the zip file. -- `binaryChecksum`: The `md5` checksum of the `headless_shell` binary itself. - -*If you're building in the cloud, don't forget to turn off your VM after retrieving the build artifacts!* - -## Diagnosing runtime failures - -After getting the build to pass, the resulting binaries often failed to run or would hang. - -You can run the headless browser manually to see what errors it is generating (replace the `c:\dev\data` with the path to a dummy folder you've created on your system): - -**Mac** -`headless_shell --disable-translate --disable-extensions --disable-background-networking --safebrowsing-disable-auto-update --disable-sync --metrics-recording-only --disable-default-apps --mute-audio --no-first-run --disable-gpu --no-sandbox --headless --hide-scrollbars --window-size=400,400 --remote-debugging-port=9221 https://example.com/` - -**Linux** -`headless_shell --disable-translate --disable-extensions --disable-background-networking --safebrowsing-disable-auto-update --disable-sync --metrics-recording-only --disable-default-apps --mute-audio --no-first-run --disable-gpu --no-sandbox --headless --hide-scrollbars --window-size=400,400 --remote-debugging-port=9221 https://example.com/` +## Testing +Search the Puppeteer Github repo for known issues that could affect our use case, and make sure to test anywhere that is affected. -**Windows** -`headless_shell.exe --disable-translate --disable-extensions --disable-background-networking --safebrowsing-disable-auto-update --disable-sync --metrics-recording-only --disable-default-apps --mute-audio --no-first-run --disable-gpu --no-sandbox --headless --hide-scrollbars --window-size=400,400 --remote-debugging-port=9221 https://example.com/` +Here's the steps on how to test a Puppeteer upgrade, run these tests on Mac, Windows, Linux x64 and Linux arm64: -In the case of Windows, you can use IE to open `http://localhost:9221` and see if the page loads. In mac/linux you can just curl the JSON endpoints: `curl http://localhost:9221/json/list`. +- Make sure the Reporting plugin is fetching the correct version of the browser + at start-up time, and that it can successfully unzip it and copy the files to + `x-pack/plugins/reporting/chromium` +- Make sure there are no errors when using the **Reporting diagnostic tool** +- All functional and API tests that generate PDF and PNG files should pass. +- Use a VM to run Kibana in a low-memory environment and try to generate a PNG of a dashboard that outputs as a 4MB file. Document the minimum requirements in the PR. ## Resources @@ -225,8 +116,6 @@ The following links provide helpful context about how the Chromium build works, - Tools for Chromium version information: https://omahaproxy.appspot.com/ - https://www.chromium.org/developers/how-tos/get-the-code/working-with-release-branches -- https://chromium.googlesource.com/chromium/src/+/HEAD/docs/windows_build_instructions.md -- https://chromium.googlesource.com/chromium/src/+/HEAD/docs/mac_build_instructions.md - https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux/build_instructions.md - Some build-flag descriptions: https://www.chromium.org/developers/gn-build-configuration - The serverless Chromium project was indispensable: https://github.com/adieuadieu/serverless-chrome/blob/b29445aa5a96d031be2edd5d1fc8651683bf262c/packages/lambda/builds/chromium/build/build.sh diff --git a/x-pack/build_chromium/build.py b/x-pack/build_chromium/build.py index 81e5f1f225ac5..2f85e95b337d5 100644 --- a/x-pack/build_chromium/build.py +++ b/x-pack/build_chromium/build.py @@ -6,7 +6,7 @@ md5_file, ) -# This file builds Chromium headless on Windows, Mac, and Linux. +# This file builds Chromium headless on Linux. # Verify that we have an argument, and if not print instructions if (len(sys.argv) < 2): @@ -76,7 +76,7 @@ runcmd('rm -rf out/headless') runcmd('mkdir out/headless') -# Copy build args/{Linux | Darwin | Windows}.gn from the root of our directory to out/headless/args.gn, +# Copy args.gn from the root of our directory to out/headless/args.gn, # add the target_cpu for cross-compilation print('Adding target_cpu to args') argsgn_file_out = path.abspath('out/headless/args.gn') @@ -89,7 +89,7 @@ print('Compiling... this will take a while') runcmd('autoninja -C out/headless headless_shell') -# Optimize the output on Linux x64 and Mac by stripping inessentials from the binary +# Optimize the output on Linux x64 by stripping inessentials from the binary # ARM must be cross-compiled from Linux and can not read the ARM binary in order to strip if platform.system() != 'Windows' and arch_name != 'arm64': print('Optimizing headless_shell') @@ -112,30 +112,10 @@ def archive_file(name): archive.write(from_path, to_path) return to_path -# Each platform has slightly different requirements for what dependencies -# must be bundled with the Chromium executable. -if platform.system() == 'Linux': - archive_file('headless_shell') - archive_file(path.join('swiftshader', 'libEGL.so')) - archive_file(path.join('swiftshader', 'libGLESv2.so')) - - if arch_name == 'arm64': - archive_file(path.join('swiftshader', 'libEGL.so')) - -elif platform.system() == 'Windows': - archive_file('headless_shell.exe') - archive_file('dbghelp.dll') - archive_file('icudtl.dat') - archive_file(path.join('swiftshader', 'libEGL.dll')) - archive_file(path.join('swiftshader', 'libEGL.dll.lib')) - archive_file(path.join('swiftshader', 'libGLESv2.dll')) - archive_file(path.join('swiftshader', 'libGLESv2.dll.lib')) - -elif platform.system() == 'Darwin': - archive_file('headless_shell') - archive_file('libswiftshader_libEGL.dylib') - archive_file('libswiftshader_libGLESv2.dylib') - archive_file(path.join('Helpers', 'chrome_crashpad_handler')) +# Add dependencies that must be bundled with the Chromium executable. +archive_file('headless_shell') +archive_file(path.join('swiftshader', 'libEGL.so')) +archive_file(path.join('swiftshader', 'libGLESv2.so')) archive.close() diff --git a/x-pack/build_chromium/darwin/args.gn b/x-pack/build_chromium/darwin/args.gn deleted file mode 100644 index 58de679538398..0000000000000 --- a/x-pack/build_chromium/darwin/args.gn +++ /dev/null @@ -1,33 +0,0 @@ -# Based on //build/headless.gn - -# Embed resource.pak into binary to simplify deployment. -headless_use_embedded_resources = true - -# In order to simplify deployment we build ICU data file -# into binary. -icu_use_data_file = false - -# Use embedded data instead external files for headless in order -# to simplify deployment. -v8_use_external_startup_data = false - -enable_nacl = false -enable_print_preview = false -enable_basic_printing = false -enable_remoting = false -use_alsa = false -use_cups = false -use_dbus = false -use_gio = false -use_libpci = false -use_pulseaudio = false -use_udev = false - -is_debug = false -symbol_level = 0 -is_component_build = false - -# Please, consult @elastic/kibana-security before changing/removing this option. -use_kerberos = false - -# target_cpu is appended before build: "x64" or "arm64" diff --git a/x-pack/build_chromium/darwin/init.sh b/x-pack/build_chromium/darwin/init.sh deleted file mode 100755 index 9ceffe65a2e5f..0000000000000 --- a/x-pack/build_chromium/darwin/init.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# Launch the cross-platform init script using a relative path -# from this script's location. -python "`dirname "$0"`/../init.py" diff --git a/x-pack/build_chromium/init.py b/x-pack/build_chromium/init.py index eff9d3edb5fac..e5a8ea3a2b9d9 100644 --- a/x-pack/build_chromium/init.py +++ b/x-pack/build_chromium/init.py @@ -3,11 +3,9 @@ from build_util import runcmd, mkdir # This is a cross-platform initialization script which should only be run -# once per environment, and isn't intended to be run directly. You should -# run the appropriate platform init script (e.g. Linux/init.sh) which will -# call this once the platform-specific initialization has completed. +# once per environment. -# Set to "arm" to build for ARM on Linux +# Set to "arm" to build for ARM arch_name = sys.argv[1] if len(sys.argv) >= 2 else 'undefined' build_path = path.abspath(os.curdir) src_path = path.abspath(path.join(build_path, 'chromium', 'src')) @@ -23,7 +21,6 @@ runcmd('git config --global core.compression 0') # Grab Chromium's custom build tools, if they aren't already installed -# (On Windows, they are installed before this Python script is run) # Put depot_tools on the path so we can properly run the fetch command if not path.isdir('depot_tools'): print('Installing depot_tools...') diff --git a/x-pack/build_chromium/linux/init.sh b/x-pack/build_chromium/linux/init.sh deleted file mode 100755 index 83cc4a8e5d4d5..0000000000000 --- a/x-pack/build_chromium/linux/init.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# Initializes a Linux environment. This need only be done once per -# machine. The OS needs to be a flavor that supports apt get, such as Ubuntu. - -if ! [ -x "$(command -v python)" ]; then - echo "Installing Python" - sudo apt-get --assume-yes install python -fi - -# Launch the cross-platform init script using a relative path -# from this script's location. -python "`dirname "$0"`/../init.py" $1 diff --git a/x-pack/build_chromium/windows/args.gn b/x-pack/build_chromium/windows/args.gn deleted file mode 100644 index 7b36a1194e2fb..0000000000000 --- a/x-pack/build_chromium/windows/args.gn +++ /dev/null @@ -1,29 +0,0 @@ -# Based on //build/headless.gn - -# Embed resource.pak into binary to simplify deployment. -headless_use_embedded_resources = true - -# Use embedded data instead external files for headless in order -# to simplify deployment. -v8_use_external_startup_data = false - -enable_nacl = false -enable_print_preview = false -enable_basic_printing = false -enable_remoting = false -use_alsa = false -use_cups = false -use_dbus = false -use_gio = false -use_libpci = false -use_pulseaudio = false -use_udev = false - -is_debug = false -symbol_level = 0 -is_component_build = false - -# Please, consult @elastic/kibana-security before changing/removing this option. -use_kerberos = false - -# target_cpu is appended before build: "x64" or "arm64" diff --git a/x-pack/build_chromium/windows/init.bat b/x-pack/build_chromium/windows/init.bat deleted file mode 100644 index 3bd82fb0adec8..0000000000000 --- a/x-pack/build_chromium/windows/init.bat +++ /dev/null @@ -1,32 +0,0 @@ -: This only needs to be run once per environment to set it up. -: This requires a GUI, as the VS installation is graphical. -: If initilization fails, you can simply install run the `install_vs.exe` - -@echo off - -: Install Visual Studio (this requires user interaction, and takes quite a while) -: Most of the subsequent commands can be run in parallel with this (downloading, unzipping, -: grabbing the source, etc). This must be completed before building, though. -@echo "Installing Visual Studio" - -powershell -command "& {iwr -outf c:\chromium\install_vs.exe https://download.visualstudio.microsoft.com/download/pr/f9c35424-ffad-4b44-bb8f-d4e3968e90ce/f75403c967456e32e758ef558957f345/vs_community.exe}" - -install_vs.exe --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.VC.ATLMFC --includeRecommended - -: Install Chromium's custom build tools -@echo "Installing Chromium build tools" - -powershell -command "& {iwr -outf %~dp0../../depot_tools.zip https://storage.googleapis.com/chrome-infra/depot_tools.zip}" -powershell -command "& {Expand-Archive %~dp0../../depot_tools.zip -DestinationPath %~dp0../../depot_tools}" - -: Set the environment variables required by depot_tools -@echo "When Visual Studio is installed, you need to enable the Windows SDK in Control Panel. After that, press here to continue initialization" - -pause - -SETX PATH "%~dp0..\..\depot_tools;%path%" -SETX DEPOT_TOOLS_WIN_TOOLCHAIN 0 - -call gclient - -python %~dp0../init.py diff --git a/x-pack/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts b/x-pack/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts index 00f854efa98ce..914a39fdf1268 100644 --- a/x-pack/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts +++ b/x-pack/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts @@ -302,7 +302,7 @@ export class HeadlessChromiumDriver { // Even though 3xx redirects go through our request // handler, we should probably inspect responses just to // avoid being bamboozled by some malicious request - this.page.on('response', (interceptedResponse: puppeteer.Response) => { + this.page.on('response', (interceptedResponse: puppeteer.HTTPResponse) => { const interceptedUrl = interceptedResponse.url(); const allowed = !interceptedUrl.startsWith('file://'); diff --git a/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/args.ts b/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/args.ts index 93cd73fbd04ae..3659e05bc3618 100644 --- a/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/args.ts +++ b/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/args.ts @@ -46,6 +46,8 @@ export const args = ({ userDataDir, viewport, disableSandbox, proxy: proxyConfig // The viewport may later need to be resized depending on the position of the clip area. // These numbers come from the job parameters, so this is a close guess. `--window-size=${Math.floor(viewport.width)},${Math.floor(viewport.height)}`, + // allow screenshot clip region to go outside of the viewport + `--mainFrameClipsContent=false`, ]; if (proxyConfig.enabled) { diff --git a/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/index.ts b/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/index.ts index 869c6c4b09cfe..35367eb615742 100644 --- a/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/index.ts +++ b/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/index.ts @@ -83,14 +83,14 @@ export class HeadlessChromiumDriverFactory { } as puppeteer.LaunchOptions); page = await browser.newPage(); - await page.emulateTimezone(browserTimezone ?? null); + await page.emulateTimezone(browserTimezone); // Log version info for debugging / maintenance const client = await page.target().createCDPSession(); const versionInfo = await client.send('Browser.getVersion'); logger.debug(`Browser version: ${JSON.stringify(versionInfo)}`); - await page.emulateTimezone(browserTimezone ?? null); + await page.emulateTimezone(browserTimezone); // Set the default timeout for all navigation methods to the openUrl timeout (30 seconds) // All waitFor methods have their own timeout config passed in to them @@ -174,7 +174,7 @@ export class HeadlessChromiumDriverFactory { }) ); - const pageRequestFailed$ = Rx.fromEvent(page, 'requestfailed').pipe( + const pageRequestFailed$ = Rx.fromEvent(page, 'requestfailed').pipe( map((req) => { const failure = req.failure && req.failure(); if (failure) { diff --git a/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/start_logs.ts b/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/start_logs.ts index cfb3abeda1e1a..9cfd0949eba99 100644 --- a/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/start_logs.ts +++ b/x-pack/plugins/reporting/server/browsers/chromium/driver_factory/start_logs.ts @@ -99,8 +99,9 @@ export const browserStartLogs = ( ); const error$ = fromEvent(browserProcess, 'error').pipe( - map(() => { + map((err) => { logger.error(`Browser process threw an error on startup`); + logger.error(err as string | Error); return i18n.translate('xpack.reporting.diagnostic.browserErrored', { defaultMessage: `Browser process threw an error on startup`, }); diff --git a/x-pack/plugins/reporting/server/browsers/chromium/paths.ts b/x-pack/plugins/reporting/server/browsers/chromium/paths.ts index 8a02a97944ecc..0fd241f2d2ca6 100644 --- a/x-pack/plugins/reporting/server/browsers/chromium/paths.ts +++ b/x-pack/plugins/reporting/server/browsers/chromium/paths.ts @@ -16,44 +16,62 @@ interface PackageInfo { binaryRelativePath: string; } -// We download zip files from a Kibana team GCS bucket named `headless_shell` enum BaseUrl { + // see https://www.chromium.org/getting-involved/download-chromium + common = 'https://commondatastorage.googleapis.com/chromium-browser-snapshots', + // A GCS bucket under the Kibana team custom = 'https://storage.googleapis.com/headless_shell', } +interface CustomPackageInfo extends PackageInfo { + location: 'custom'; +} +interface CommonPackageInfo extends PackageInfo { + location: 'common'; + archivePath: string; +} + export class ChromiumArchivePaths { - public readonly packages: PackageInfo[] = [ + public readonly revision = '856583'; + + public readonly packages: Array = [ { platform: 'darwin', architecture: 'x64', - archiveFilename: 'chromium-ef768c9-darwin_x64.zip', - archiveChecksum: 'd87287f6b2159cff7c64babac873cc73', - binaryChecksum: '8d777b3380a654e2730fc36afbfb11e1', - binaryRelativePath: 'headless_shell-darwin_x64/headless_shell', + archiveFilename: 'chrome-mac.zip', + archiveChecksum: '6aad6fa5a26d83e24e2f0d52de5230bf', + binaryChecksum: '2dc7a7250d849df4cab60f3b4a70c1ea', + binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium', + location: 'common', + archivePath: 'Mac', }, { platform: 'linux', architecture: 'x64', - archiveFilename: 'chromium-ef768c9-linux_x64.zip', - archiveChecksum: '85575e8fd56849f4de5e3584e05712c0', - binaryChecksum: '38c4d849c17683def1283d7e5aa56fe9', + archiveFilename: 'chromium-d163fd7-linux_x64.zip', + archiveChecksum: 'fba0a240d409228a3494aef415c300fc', + binaryChecksum: '99cfab472d516038b94ef86649e52871', binaryRelativePath: 'headless_shell-linux_x64/headless_shell', + location: 'custom', }, { platform: 'linux', architecture: 'arm64', - archiveFilename: 'chromium-ef768c9-linux_arm64.zip', - archiveChecksum: '20b09b70476bea76a276c583bf72eac7', - binaryChecksum: 'dcfd277800c1a5c7d566c445cbdc225c', + archiveFilename: 'chromium-d163fd7-linux_arm64.zip', + archiveChecksum: '29834735bc2f0e0d9134c33bc0580fb6', + binaryChecksum: '13baccf2e5c8385cb9d9588db6a9e2c2', binaryRelativePath: 'headless_shell-linux_arm64/headless_shell', + location: 'custom', }, { platform: 'win32', architecture: 'x64', - archiveFilename: 'chromium-ef768c9-windows_x64.zip', - archiveChecksum: '33301c749b5305b65311742578c52f15', - binaryChecksum: '9f28dd56c7a304a22bf66f0097fa4de9', - binaryRelativePath: 'headless_shell-windows_x64\\headless_shell.exe', + archiveFilename: 'chrome-win.zip', + archiveChecksum: '64999a384bfb6c96c50c4cb6810dbc05', + binaryChecksum: '13b8bbb4a12f9036b8cc3b57b3a71fec', + binaryRelativePath: 'chrome-win\\chrome.exe', + location: 'common', + archivePath: 'Win', }, ]; @@ -72,8 +90,11 @@ export class ChromiumArchivePaths { return this.packages.map((p) => this.resolvePath(p)); } - public getDownloadUrl(p: PackageInfo) { - return BaseUrl.custom + `/${p.archiveFilename}`; + public getDownloadUrl(p: CustomPackageInfo | CommonPackageInfo) { + if (p.location === 'common') { + return `${BaseUrl.common}/${p.archivePath}/${this.revision}/${p.archiveFilename}`; + } + return BaseUrl.custom + '/' + p.archiveFilename; } public getBinaryPath(p: PackageInfo) { diff --git a/x-pack/plugins/reporting/server/browsers/install.ts b/x-pack/plugins/reporting/server/browsers/install.ts index 93d860d0528fe..51045c4ef038f 100644 --- a/x-pack/plugins/reporting/server/browsers/install.ts +++ b/x-pack/plugins/reporting/server/browsers/install.ts @@ -40,16 +40,14 @@ export function installBrowser( if (binaryChecksum !== pkg.binaryChecksum) { await ensureBrowserDownloaded(logger); + await del(chromiumPath); const archive = path.join(paths.archivesPath, pkg.archiveFilename); - logger.info(`Extracting [${archive}] to [${binaryPath}]`); - - await del(chromiumPath); + logger.info(`Extracting [${archive}] to [${chromiumPath}]`); await extract(archive, chromiumPath); } - logger.debug(`Browser executable: ${binaryPath}`); - + logger.info(`Browser executable: ${binaryPath}`); binaryPath$.next(binaryPath); // subscribers wait for download and extract to complete }; diff --git a/x-pack/plugins/reporting/server/lib/screenshots/constants.ts b/x-pack/plugins/reporting/server/lib/screenshots/constants.ts index 3d8c50782deed..226f5bc52d8d9 100644 --- a/x-pack/plugins/reporting/server/lib/screenshots/constants.ts +++ b/x-pack/plugins/reporting/server/lib/screenshots/constants.ts @@ -9,7 +9,6 @@ import { APP_WRAPPER_CLASS } from '../../../../../../src/core/server'; export const DEFAULT_PAGELOAD_SELECTOR = `.${APP_WRAPPER_CLASS}`; export const CONTEXT_GETNUMBEROFITEMS = 'GetNumberOfItems'; -export const CONTEXT_GETBROWSERDIMENSIONS = 'GetBrowserDimensions'; export const CONTEXT_INJECTCSS = 'InjectCss'; export const CONTEXT_WAITFORRENDER = 'WaitForRender'; export const CONTEXT_GETTIMERANGE = 'GetTimeRange'; diff --git a/x-pack/plugins/reporting/server/lib/screenshots/get_screenshots.ts b/x-pack/plugins/reporting/server/lib/screenshots/get_screenshots.ts index b279fe5f082ee..70838079ad3a1 100644 --- a/x-pack/plugins/reporting/server/lib/screenshots/get_screenshots.ts +++ b/x-pack/plugins/reporting/server/lib/screenshots/get_screenshots.ts @@ -10,54 +10,6 @@ import { LevelLogger, startTrace } from '../'; import { HeadlessChromiumDriver } from '../../browsers'; import { LayoutInstance } from '../layouts'; import { ElementsPositionAndAttribute, Screenshot } from './'; -import { CONTEXT_GETBROWSERDIMENSIONS } from './constants'; - -// In Puppeteer 5.4+, the viewport size limits what the screenshot can take, even if a clip is specified. The clip area must -// be visible in the viewport. This workaround resizes the viewport to the actual content height and width. -// NOTE: this will fire a window resize event -const resizeToClipArea = async ( - item: ElementsPositionAndAttribute, - browser: HeadlessChromiumDriver, - zoom: number, - logger: LevelLogger -) => { - // Check current viewport size - const { width, height, left, top } = item.position.boundingClientRect; // the "unscaled" pixel sizes - const [viewWidth, viewHeight] = await browser.evaluate( - { - fn: () => [document.body.clientWidth, document.body.clientHeight], - args: [], - }, - { context: CONTEXT_GETBROWSERDIMENSIONS }, - logger - ); - - logger.debug(`Browser viewport: width=${viewWidth} height=${viewHeight}`); - - // Resize the viewport if the clip area is not visible - if (viewWidth < width + left || viewHeight < height + top) { - logger.debug(`Item's position is not within the viewport.`); - - // add left and top margin to unscaled measurements - const newWidth = width + left; - const newHeight = height + top; - - logger.debug( - `Resizing browser viewport to: width=${newWidth} height=${newHeight} zoom=${zoom}` - ); - - await browser.setViewport( - { - width: newWidth, - height: newHeight, - zoom, - }, - logger - ); - } - - logger.debug(`Capturing item: width=${width} height=${height} left=${left} top=${top}`); -}; export const getScreenshots = async ( browser: HeadlessChromiumDriver, @@ -77,7 +29,6 @@ export const getScreenshots = async ( const endTrace = startTrace('get_screenshots', 'read'); const item = elementsPositionAndAttributes[i]; - await resizeToClipArea(item, browser, layout.getBrowserZoom(), logger); const base64EncodedData = await browser.screenshot(item.position); if (!base64EncodedData) { diff --git a/x-pack/plugins/reporting/server/lib/screenshots/observable.test.ts b/x-pack/plugins/reporting/server/lib/screenshots/observable.test.ts index 5419775f14407..a10f1f7a3788d 100644 --- a/x-pack/plugins/reporting/server/lib/screenshots/observable.test.ts +++ b/x-pack/plugins/reporting/server/lib/screenshots/observable.test.ts @@ -341,8 +341,6 @@ describe('Screenshot Observable Pipeline', () => { if (mockCall === contexts.CONTEXT_ELEMENTATTRIBUTES) { return Promise.resolve(null); - } else if (mockCall === contexts.CONTEXT_GETBROWSERDIMENSIONS) { - return Promise.resolve([800, 600]); } else { return Promise.resolve(); } diff --git a/x-pack/plugins/reporting/server/test_helpers/create_mock_browserdriverfactory.ts b/x-pack/plugins/reporting/server/test_helpers/create_mock_browserdriverfactory.ts index 59256c4cd919b..3446160c0d7f5 100644 --- a/x-pack/plugins/reporting/server/test_helpers/create_mock_browserdriverfactory.ts +++ b/x-pack/plugins/reporting/server/test_helpers/create_mock_browserdriverfactory.ts @@ -65,9 +65,6 @@ mockBrowserEvaluate.mockImplementation(() => { if (mockCall === contexts.CONTEXT_GETNUMBEROFITEMS) { return Promise.resolve(1); } - if (mockCall === contexts.CONTEXT_GETBROWSERDIMENSIONS) { - return Promise.resolve([600, 800]); - } if (mockCall === contexts.CONTEXT_INJECTCSS) { return Promise.resolve(); } diff --git a/x-pack/test/functional/apps/dashboard/reporting/lib/compare_pngs.ts b/x-pack/test/functional/apps/dashboard/reporting/lib/compare_pngs.ts index a05464fefc5f9..bc15ba2f65ca7 100644 --- a/x-pack/test/functional/apps/dashboard/reporting/lib/compare_pngs.ts +++ b/x-pack/test/functional/apps/dashboard/reporting/lib/compare_pngs.ts @@ -40,8 +40,7 @@ export async function checkIfPngsMatch( log.debug(`writeFile: ${baselineCopyPath}`); await fs.writeFile(baselineCopyPath, await fs.readFile(baselinepngPath)); } catch (error) { - log.error(`No baseline png found at ${baselinepngPath}`); - return 0; + throw new Error(`No baseline png found at ${baselinepngPath}`); } log.debug(`writeFile: ${actualCopyPath}`); await fs.writeFile(actualCopyPath, await fs.readFile(actualpngPath)); diff --git a/x-pack/test/functional/apps/dashboard/reporting/reports/baseline/large_dashboard_preserve_layout.png b/x-pack/test/functional/apps/dashboard/reporting/reports/baseline/large_dashboard_preserve_layout.png new file mode 100644 index 0000000000000..0694d85f4f5ff Binary files /dev/null and b/x-pack/test/functional/apps/dashboard/reporting/reports/baseline/large_dashboard_preserve_layout.png differ diff --git a/x-pack/test/functional/apps/dashboard/reporting/reports/baseline/dashboard_preserve_layout.png b/x-pack/test/functional/apps/dashboard/reporting/reports/baseline/small_dashboard_preserve_layout.png similarity index 100% rename from x-pack/test/functional/apps/dashboard/reporting/reports/baseline/dashboard_preserve_layout.png rename to x-pack/test/functional/apps/dashboard/reporting/reports/baseline/small_dashboard_preserve_layout.png diff --git a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts index a24b18490be74..94de5999a6a07 100644 --- a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts +++ b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts @@ -120,21 +120,21 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('PNG Layout', () => { - it('downloads a PNG file', async function () { - const writeSessionReport = async (name: string, rawPdf: Buffer, reportExt: string) => { - const sessionDirectory = path.resolve(REPORTS_FOLDER, 'session'); - await mkdirAsync(sessionDirectory, { recursive: true }); - const sessionReportPath = path.resolve(sessionDirectory, `${name}.${reportExt}`); - await writeFileAsync(sessionReportPath, rawPdf); - return sessionReportPath; - }; - const getBaselineReportPath = (fileName: string, reportExt: string) => { - const baselineFolder = path.resolve(REPORTS_FOLDER, 'baseline'); - const fullPath = path.resolve(baselineFolder, `${fileName}.${reportExt}`); - log.debug(`getBaselineReportPath (${fullPath})`); - return fullPath; - }; - + const writeSessionReport = async (name: string, rawPdf: Buffer, reportExt: string) => { + const sessionDirectory = path.resolve(REPORTS_FOLDER, 'session'); + await mkdirAsync(sessionDirectory, { recursive: true }); + const sessionReportPath = path.resolve(sessionDirectory, `${name}.${reportExt}`); + await writeFileAsync(sessionReportPath, rawPdf); + return sessionReportPath; + }; + const getBaselineReportPath = (fileName: string, reportExt: string) => { + const baselineFolder = path.resolve(REPORTS_FOLDER, 'baseline'); + const fullPath = path.resolve(baselineFolder, `${fileName}.${reportExt}`); + log.debug(`getBaselineReportPath (${fullPath})`); + return fullPath; + }; + + it('downloads a PNG file: small dashboard', async function () { this.timeout(300000); await PageObjects.common.navigateToApp('dashboard'); @@ -146,7 +146,31 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const url = await PageObjects.reporting.getReportURL(60000); const reportData = await PageObjects.reporting.getRawPdfReportData(url); - const reportFileName = 'dashboard_preserve_layout'; + const reportFileName = 'small_dashboard_preserve_layout'; + const sessionReportPath = await writeSessionReport(reportFileName, reportData, 'png'); + const percentDiff = await checkIfPngsMatch( + sessionReportPath, + getBaselineReportPath(reportFileName, 'png'), + config.get('screenshots.directory'), + log + ); + + expect(percentDiff).to.be.lessThan(0.09); + }); + + it('downloads a PNG file: large dashboard', async function () { + this.timeout(300000); + + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.loadSavedDashboard('Large Dashboard'); + await PageObjects.reporting.openPngReportingPanel(); + await PageObjects.reporting.forceSharedItemsContainerSize({ width: 1405 }); + await PageObjects.reporting.clickGenerateReportButton(); + await PageObjects.reporting.removeForceSharedItemsContainerSize(); + + const url = await PageObjects.reporting.getReportURL(200000); + const reportData = await PageObjects.reporting.getRawPdfReportData(url); + const reportFileName = 'large_dashboard_preserve_layout'; const sessionReportPath = await writeSessionReport(reportFileName, reportData, 'png'); const percentDiff = await checkIfPngsMatch( sessionReportPath, @@ -160,9 +184,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('Preserve Layout', () => { - it('downloads a PDF file', async function () { - // Generating and then comparing reports can take longer than the default 60s timeout because the comparePngs - // function is taking about 15 seconds per comparison in jenkins. + it('downloads a PDF file: small dashboard', async function () { this.timeout(300000); await PageObjects.common.navigateToApp('dashboard'); await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); @@ -176,10 +198,22 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(res.get('content-type')).to.equal('application/pdf'); }); + it('downloads a PDF file: large dashboard', async function () { + this.timeout(300000); + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.loadSavedDashboard('Large Dashboard'); + await PageObjects.reporting.openPdfReportingPanel(); + await PageObjects.reporting.clickGenerateReportButton(); + + const url = await PageObjects.reporting.getReportURL(60000); + const res = await PageObjects.reporting.getResponse(url); + + expect(res.status).to.equal(200); + expect(res.get('content-type')).to.equal('application/pdf'); + }); + it('downloads a PDF file with saved search given EuiDataGrid enabled', async function () { await kibanaServer.uiSettings.replace({ 'doc_table:legacy': false }); - // Generating and then comparing reports can take longer than the default 60s timeout because the comparePngs - // function is taking about 15 seconds per comparison in jenkins. this.timeout(300000); await PageObjects.common.navigateToApp('dashboard'); await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); diff --git a/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/data.json b/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/data.json index e0b2ee3079296..d64ba9595b7bc 100644 --- a/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/data.json +++ b/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/data.json @@ -16,24 +16,6 @@ } } -{ - "type": "doc", - "value": { - "id": "config:8.0.0", - "index": ".kibana_1", - "source": { - "config": { - "buildNum": 9007199254740991, - "dateFormat:tz": "UTC", - "defaultIndex": "5193f870-d861-11e9-a311-0fa548c5f953" - }, - "references": [], - "type": "config", - "updated_at": "2019-12-11T23:22:12.698Z" - } - } -} - { "type": "doc", "value": { @@ -411,3 +393,334 @@ } } } + +{ + "type": "doc", + "value": { + "id": "search:e5bfe380-ac3e-11eb-8f24-bffe9ba4af2b", + "index": ".kibana_1", + "source": { + "references": [ + { + "id": "5193f870-d861-11e9-a311-0fa548c5f953", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "search": { + "columns": [ + "order_date", + "category", + "currency", + "customer_id", + "order_id", + "day_of_week_i", + "products.created_on", + "sku" + ], + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [ + [ + "order_date", + "desc" + ] + ], + "title": "Ecommerce Data (copy)", + "version": 1 + }, + "type": "search", + "updated_at": "2021-05-03T18:39:30.751Z" + } + } +} + +{ + "type": "doc", + "value": { + "id": "dashboard:f7192e90-ac3c-11eb-8f24-bffe9ba4af2b", + "index": ".kibana_1", + "source": { + "dashboard": { + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}" + }, + "optionsJSON": "{\"hidePanelTitles\":false,\"useMargins\":true}", + "panelsJSON": "[{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":9,\"y\":0,\"w\":24,\"h\":15,\"i\":\"914ac161-94d4-4d93-a287-c21fca46a974\"},\"panelIndex\":\"914ac161-94d4-4d93-a287-c21fca46a974\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_914ac161-94d4-4d93-a287-c21fca46a974\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":22,\"y\":15,\"w\":24,\"h\":15,\"i\":\"c4cec7d1-97e3-4101-adc4-c3f15102511c\"},\"panelIndex\":\"c4cec7d1-97e3-4101-adc4-c3f15102511c\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_c4cec7d1-97e3-4101-adc4-c3f15102511c\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":30,\"w\":24,\"h\":15,\"i\":\"09f7de68-0d07-4661-8fda-73ea8b577ac7\"},\"panelIndex\":\"09f7de68-0d07-4661-8fda-73ea8b577ac7\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_09f7de68-0d07-4661-8fda-73ea8b577ac7\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":19,\"y\":45,\"w\":24,\"h\":15,\"i\":\"6c25ca6e-6aa1-4f06-9a96-e83ffd9f52e8\"},\"panelIndex\":\"6c25ca6e-6aa1-4f06-9a96-e83ffd9f52e8\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_6c25ca6e-6aa1-4f06-9a96-e83ffd9f52e8\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":60,\"w\":24,\"h\":15,\"i\":\"37764cf9-3c89-454a-bd7e-ae4c242dc624\"},\"panelIndex\":\"37764cf9-3c89-454a-bd7e-ae4c242dc624\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_37764cf9-3c89-454a-bd7e-ae4c242dc624\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":15,\"y\":75,\"w\":24,\"h\":15,\"i\":\"990422fd-a9cf-446f-ba2f-ea9178a7b2e0\"},\"panelIndex\":\"990422fd-a9cf-446f-ba2f-ea9178a7b2e0\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_990422fd-a9cf-446f-ba2f-ea9178a7b2e0\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":19,\"y\":90,\"w\":24,\"h\":15,\"i\":\"0cdc13ec-2775-4da9-9a47-1e833bb807eb\"},\"panelIndex\":\"0cdc13ec-2775-4da9-9a47-1e833bb807eb\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_0cdc13ec-2775-4da9-9a47-1e833bb807eb\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":18,\"y\":105,\"w\":24,\"h\":15,\"i\":\"eee160de-5777-40c8-9c2c-e75f64bf208a\"},\"panelIndex\":\"eee160de-5777-40c8-9c2c-e75f64bf208a\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_eee160de-5777-40c8-9c2c-e75f64bf208a\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":120,\"w\":24,\"h\":15,\"i\":\"b36f6a97-5d3d-4fc4-b076-b3e514f8f7bb\"},\"panelIndex\":\"b36f6a97-5d3d-4fc4-b076-b3e514f8f7bb\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_b36f6a97-5d3d-4fc4-b076-b3e514f8f7bb\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":19,\"y\":135,\"w\":24,\"h\":15,\"i\":\"2e72acbf-7ade-451e-a5e4-7414f12facf2\"},\"panelIndex\":\"2e72acbf-7ade-451e-a5e4-7414f12facf2\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_2e72acbf-7ade-451e-a5e4-7414f12facf2\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":19,\"y\":150,\"w\":24,\"h\":15,\"i\":\"4119e9b0-5d03-482d-9356-89bb62b6a851\"},\"panelIndex\":\"4119e9b0-5d03-482d-9356-89bb62b6a851\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_4119e9b0-5d03-482d-9356-89bb62b6a851\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":165,\"w\":24,\"h\":15,\"i\":\"42b4a37c-8b04-4510-9f27-831355221b65\"},\"panelIndex\":\"42b4a37c-8b04-4510-9f27-831355221b65\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_42b4a37c-8b04-4510-9f27-831355221b65\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":14,\"y\":180,\"w\":24,\"h\":15,\"i\":\"dc676050-d752-4c3e-a1ae-73ef2f1bcdc6\"},\"panelIndex\":\"dc676050-d752-4c3e-a1ae-73ef2f1bcdc6\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_dc676050-d752-4c3e-a1ae-73ef2f1bcdc6\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":17,\"y\":195,\"w\":24,\"h\":15,\"i\":\"6602e0e0-9e66-4e0e-90c1-f66b9c3d2340\"},\"panelIndex\":\"6602e0e0-9e66-4e0e-90c1-f66b9c3d2340\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_6602e0e0-9e66-4e0e-90c1-f66b9c3d2340\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":210,\"w\":24,\"h\":15,\"i\":\"c9c65725-9b4d-4343-93db-7efa4a7a2d60\"},\"panelIndex\":\"c9c65725-9b4d-4343-93db-7efa4a7a2d60\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_c9c65725-9b4d-4343-93db-7efa4a7a2d60\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":19,\"y\":225,\"w\":24,\"h\":15,\"i\":\"69141f9b-5c23-409d-9c96-7f94c243f79e\"},\"panelIndex\":\"69141f9b-5c23-409d-9c96-7f94c243f79e\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_69141f9b-5c23-409d-9c96-7f94c243f79e\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":17,\"y\":240,\"w\":24,\"h\":15,\"i\":\"6feeec2c-34ab-4844-8445-e417c8e0595b\"},\"panelIndex\":\"6feeec2c-34ab-4844-8445-e417c8e0595b\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_6feeec2c-34ab-4844-8445-e417c8e0595b\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":15,\"y\":255,\"w\":24,\"h\":15,\"i\":\"985d9dc1-de44-4803-afad-f1d497d050a1\"},\"panelIndex\":\"985d9dc1-de44-4803-afad-f1d497d050a1\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_985d9dc1-de44-4803-afad-f1d497d050a1\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":270,\"w\":24,\"h\":15,\"i\":\"d7ef9e23-d0dd-4c7c-90b3-f611bbfcd1b0\"},\"panelIndex\":\"d7ef9e23-d0dd-4c7c-90b3-f611bbfcd1b0\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_d7ef9e23-d0dd-4c7c-90b3-f611bbfcd1b0\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":20,\"y\":285,\"w\":24,\"h\":15,\"i\":\"6b0768b1-0cd2-47f0-a639-b369e7318d44\"},\"panelIndex\":\"6b0768b1-0cd2-47f0-a639-b369e7318d44\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_6b0768b1-0cd2-47f0-a639-b369e7318d44\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":20,\"y\":300,\"w\":24,\"h\":15,\"i\":\"c9cc2835-06a8-4448-b703-2d41a6692feb\"},\"panelIndex\":\"c9cc2835-06a8-4448-b703-2d41a6692feb\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_c9cc2835-06a8-4448-b703-2d41a6692feb\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":315,\"w\":24,\"h\":15,\"i\":\"af2a55b1-8b3d-478a-96b1-72e4f12585e4\"},\"panelIndex\":\"af2a55b1-8b3d-478a-96b1-72e4f12585e4\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_af2a55b1-8b3d-478a-96b1-72e4f12585e4\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":19,\"y\":330,\"w\":24,\"h\":15,\"i\":\"ee92986a-adab-4d66-ad4e-a43a608f52f7\"},\"panelIndex\":\"ee92986a-adab-4d66-ad4e-a43a608f52f7\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_ee92986a-adab-4d66-ad4e-a43a608f52f7\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":22,\"y\":345,\"w\":24,\"h\":15,\"i\":\"3b4e1fd0-2acb-444a-b478-42d7bd10b96c\"},\"panelIndex\":\"3b4e1fd0-2acb-444a-b478-42d7bd10b96c\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_3b4e1fd0-2acb-444a-b478-42d7bd10b96c\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":360,\"w\":24,\"h\":15,\"i\":\"04d7056d-88a4-4b00-b8f4-33f79f1b6f7a\"},\"panelIndex\":\"04d7056d-88a4-4b00-b8f4-33f79f1b6f7a\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_04d7056d-88a4-4b00-b8f4-33f79f1b6f7a\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":21,\"y\":375,\"w\":24,\"h\":15,\"i\":\"51122bae-427e-45a6-904e-6c821447cc46\"},\"panelIndex\":\"51122bae-427e-45a6-904e-6c821447cc46\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_51122bae-427e-45a6-904e-6c821447cc46\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":20,\"y\":390,\"w\":24,\"h\":15,\"i\":\"4efab22c-1892-4013-8406-5e5d924a8a21\"},\"panelIndex\":\"4efab22c-1892-4013-8406-5e5d924a8a21\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_4efab22c-1892-4013-8406-5e5d924a8a21\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":405,\"w\":24,\"h\":15,\"i\":\"4c3c1b29-100e-474c-8290-9470684ae407\"},\"panelIndex\":\"4c3c1b29-100e-474c-8290-9470684ae407\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_4c3c1b29-100e-474c-8290-9470684ae407\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":18,\"y\":420,\"w\":24,\"h\":15,\"i\":\"b4501df0-d759-4513-9e87-5dd8eefe4a4f\"},\"panelIndex\":\"b4501df0-d759-4513-9e87-5dd8eefe4a4f\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_b4501df0-d759-4513-9e87-5dd8eefe4a4f\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":20,\"y\":435,\"w\":24,\"h\":15,\"i\":\"4fbff0ec-b3a6-4ee7-8734-9b177c3e51c6\"},\"panelIndex\":\"4fbff0ec-b3a6-4ee7-8734-9b177c3e51c6\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_4fbff0ec-b3a6-4ee7-8734-9b177c3e51c6\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":450,\"w\":24,\"h\":15,\"i\":\"13d9982e-2745-44b1-af94-fa4b9f6761a9\"},\"panelIndex\":\"13d9982e-2745-44b1-af94-fa4b9f6761a9\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_13d9982e-2745-44b1-af94-fa4b9f6761a9\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":17,\"y\":465,\"w\":24,\"h\":15,\"i\":\"efa18320-9650-4bfe-9418-ac29b7979f70\"},\"panelIndex\":\"efa18320-9650-4bfe-9418-ac29b7979f70\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_efa18320-9650-4bfe-9418-ac29b7979f70\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":21,\"y\":480,\"w\":24,\"h\":15,\"i\":\"1f03bc70-0545-4a3a-bebc-ad477674b841\"},\"panelIndex\":\"1f03bc70-0545-4a3a-bebc-ad477674b841\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_1f03bc70-0545-4a3a-bebc-ad477674b841\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":495,\"w\":24,\"h\":15,\"i\":\"d766ce3a-9ec5-4ead-8698-6a2e66e729bb\"},\"panelIndex\":\"d766ce3a-9ec5-4ead-8698-6a2e66e729bb\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_d766ce3a-9ec5-4ead-8698-6a2e66e729bb\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":19,\"y\":510,\"w\":24,\"h\":15,\"i\":\"de93deb0-6c16-45ae-8fae-de0b2e1c4ae0\"},\"panelIndex\":\"de93deb0-6c16-45ae-8fae-de0b2e1c4ae0\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_de93deb0-6c16-45ae-8fae-de0b2e1c4ae0\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":525,\"w\":24,\"h\":15,\"i\":\"b93cc5e1-084a-42d9-9958-a3f569573d43\"},\"panelIndex\":\"b93cc5e1-084a-42d9-9958-a3f569573d43\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_b93cc5e1-084a-42d9-9958-a3f569573d43\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":20,\"y\":540,\"w\":24,\"h\":15,\"i\":\"0b6c380f-3536-4f03-8dbd-95c53be69263\"},\"panelIndex\":\"0b6c380f-3536-4f03-8dbd-95c53be69263\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_0b6c380f-3536-4f03-8dbd-95c53be69263\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":23,\"y\":555,\"w\":24,\"h\":15,\"i\":\"5c68b67a-ac42-48b8-85de-2409aaa0cdc6\"},\"panelIndex\":\"5c68b67a-ac42-48b8-85de-2409aaa0cdc6\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_5c68b67a-ac42-48b8-85de-2409aaa0cdc6\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":24,\"y\":570,\"w\":24,\"h\":15,\"i\":\"098a69b8-c9a0-40c8-8703-62838e0ec4a9\"},\"panelIndex\":\"098a69b8-c9a0-40c8-8703-62838e0ec4a9\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_098a69b8-c9a0-40c8-8703-62838e0ec4a9\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":1,\"y\":585,\"w\":24,\"h\":15,\"i\":\"a0f4b9ce-2e36-4d22-8dd9-8988f1a3b883\"},\"panelIndex\":\"a0f4b9ce-2e36-4d22-8dd9-8988f1a3b883\",\"embeddableConfig\":{\"vis\":null,\"enhancements\":{}},\"panelRefName\":\"panel_a0f4b9ce-2e36-4d22-8dd9-8988f1a3b883\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":15,\"y\":600,\"w\":24,\"h\":15,\"i\":\"eb651411-ea02-4506-a674-f0125d0b2a4a\"},\"panelIndex\":\"eb651411-ea02-4506-a674-f0125d0b2a4a\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_eb651411-ea02-4506-a674-f0125d0b2a4a\"},{\"version\":\"8.0.0\",\"type\":\"search\",\"gridData\":{\"x\":0,\"y\":615,\"w\":48,\"h\":111,\"i\":\"8ec9b67a-5d08-4006-bccc-a7341b88bb63\"},\"panelIndex\":\"8ec9b67a-5d08-4006-bccc-a7341b88bb63\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_8ec9b67a-5d08-4006-bccc-a7341b88bb63\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":4,\"y\":852,\"w\":24,\"h\":15,\"i\":\"1201144d-5c9c-4015-89a3-0cb803405986\"},\"panelIndex\":\"1201144d-5c9c-4015-89a3-0cb803405986\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_1201144d-5c9c-4015-89a3-0cb803405986\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":24,\"y\":837,\"w\":24,\"h\":15,\"i\":\"913c1c46-ded4-4e04-81ff-e683f725d3a5\"},\"panelIndex\":\"913c1c46-ded4-4e04-81ff-e683f725d3a5\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_913c1c46-ded4-4e04-81ff-e683f725d3a5\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":867,\"w\":24,\"h\":15,\"i\":\"f49dfd93-ce95-4a65-b9ec-531f340da083\"},\"panelIndex\":\"f49dfd93-ce95-4a65-b9ec-531f340da083\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_f49dfd93-ce95-4a65-b9ec-531f340da083\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":18,\"y\":882,\"w\":24,\"h\":15,\"i\":\"0705993c-492c-4ce0-83e0-a481c90bd432\"},\"panelIndex\":\"0705993c-492c-4ce0-83e0-a481c90bd432\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_0705993c-492c-4ce0-83e0-a481c90bd432\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":24,\"y\":897,\"w\":24,\"h\":15,\"i\":\"02de39d3-6839-4198-94e3-cc91f61d0c6e\"},\"panelIndex\":\"02de39d3-6839-4198-94e3-cc91f61d0c6e\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_02de39d3-6839-4198-94e3-cc91f61d0c6e\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":5,\"y\":912,\"w\":24,\"h\":15,\"i\":\"e6b958fa-931f-4358-94fc-07934419066d\"},\"panelIndex\":\"e6b958fa-931f-4358-94fc-07934419066d\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_e6b958fa-931f-4358-94fc-07934419066d\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":927,\"w\":24,\"h\":15,\"i\":\"e6d70fc7-1bdc-4743-9a15-615dff91a5c1\"},\"panelIndex\":\"e6d70fc7-1bdc-4743-9a15-615dff91a5c1\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_e6d70fc7-1bdc-4743-9a15-615dff91a5c1\"},{\"version\":\"8.0.0\",\"type\":\"visualization\",\"gridData\":{\"x\":22,\"y\":942,\"w\":24,\"h\":15,\"i\":\"9db5f35e-ab94-4a5a-8c0f-70bf2aa095aa\"},\"panelIndex\":\"9db5f35e-ab94-4a5a-8c0f-70bf2aa095aa\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_9db5f35e-ab94-4a5a-8c0f-70bf2aa095aa\"},{\"version\":\"8.0.0\",\"type\":\"search\",\"gridData\":{\"x\":0,\"y\":726,\"w\":48,\"h\":111,\"i\":\"e985d8b0-4a76-46d0-af01-3edab5995b97\"},\"panelIndex\":\"e985d8b0-4a76-46d0-af01-3edab5995b97\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_e985d8b0-4a76-46d0-af01-3edab5995b97\"}]", + "refreshInterval": { + "pause": true, + "value": 0 + }, + "timeFrom": "2019-06-01T03:59:54.350Z", + "timeRestore": true, + "timeTo": "2019-08-01T14:52:40.436Z", + "title": "Large Dashboard", + "version": 1 + }, + "references": [ + { + "id": "0a464230-79f0-11ea-ae7f-13c5d6e410a0", + "name": "914ac161-94d4-4d93-a287-c21fca46a974:panel_914ac161-94d4-4d93-a287-c21fca46a974", + "type": "visualization" + }, + { + "id": "200609c0-79f0-11ea-ae7f-13c5d6e410a0", + "name": "c4cec7d1-97e3-4101-adc4-c3f15102511c:panel_c4cec7d1-97e3-4101-adc4-c3f15102511c", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "09f7de68-0d07-4661-8fda-73ea8b577ac7:panel_09f7de68-0d07-4661-8fda-73ea8b577ac7", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "6c25ca6e-6aa1-4f06-9a96-e83ffd9f52e8:panel_6c25ca6e-6aa1-4f06-9a96-e83ffd9f52e8", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "37764cf9-3c89-454a-bd7e-ae4c242dc624:panel_37764cf9-3c89-454a-bd7e-ae4c242dc624", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "990422fd-a9cf-446f-ba2f-ea9178a7b2e0:panel_990422fd-a9cf-446f-ba2f-ea9178a7b2e0", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "0cdc13ec-2775-4da9-9a47-1e833bb807eb:panel_0cdc13ec-2775-4da9-9a47-1e833bb807eb", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "eee160de-5777-40c8-9c2c-e75f64bf208a:panel_eee160de-5777-40c8-9c2c-e75f64bf208a", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "b36f6a97-5d3d-4fc4-b076-b3e514f8f7bb:panel_b36f6a97-5d3d-4fc4-b076-b3e514f8f7bb", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "2e72acbf-7ade-451e-a5e4-7414f12facf2:panel_2e72acbf-7ade-451e-a5e4-7414f12facf2", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "4119e9b0-5d03-482d-9356-89bb62b6a851:panel_4119e9b0-5d03-482d-9356-89bb62b6a851", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "42b4a37c-8b04-4510-9f27-831355221b65:panel_42b4a37c-8b04-4510-9f27-831355221b65", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "dc676050-d752-4c3e-a1ae-73ef2f1bcdc6:panel_dc676050-d752-4c3e-a1ae-73ef2f1bcdc6", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "6602e0e0-9e66-4e0e-90c1-f66b9c3d2340:panel_6602e0e0-9e66-4e0e-90c1-f66b9c3d2340", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "c9c65725-9b4d-4343-93db-7efa4a7a2d60:panel_c9c65725-9b4d-4343-93db-7efa4a7a2d60", + "type": "visualization" + }, + { + "id": "200609c0-79f0-11ea-ae7f-13c5d6e410a0", + "name": "69141f9b-5c23-409d-9c96-7f94c243f79e:panel_69141f9b-5c23-409d-9c96-7f94c243f79e", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "6feeec2c-34ab-4844-8445-e417c8e0595b:panel_6feeec2c-34ab-4844-8445-e417c8e0595b", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "985d9dc1-de44-4803-afad-f1d497d050a1:panel_985d9dc1-de44-4803-afad-f1d497d050a1", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "d7ef9e23-d0dd-4c7c-90b3-f611bbfcd1b0:panel_d7ef9e23-d0dd-4c7c-90b3-f611bbfcd1b0", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "6b0768b1-0cd2-47f0-a639-b369e7318d44:panel_6b0768b1-0cd2-47f0-a639-b369e7318d44", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "c9cc2835-06a8-4448-b703-2d41a6692feb:panel_c9cc2835-06a8-4448-b703-2d41a6692feb", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "af2a55b1-8b3d-478a-96b1-72e4f12585e4:panel_af2a55b1-8b3d-478a-96b1-72e4f12585e4", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "ee92986a-adab-4d66-ad4e-a43a608f52f7:panel_ee92986a-adab-4d66-ad4e-a43a608f52f7", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "3b4e1fd0-2acb-444a-b478-42d7bd10b96c:panel_3b4e1fd0-2acb-444a-b478-42d7bd10b96c", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "04d7056d-88a4-4b00-b8f4-33f79f1b6f7a:panel_04d7056d-88a4-4b00-b8f4-33f79f1b6f7a", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "51122bae-427e-45a6-904e-6c821447cc46:panel_51122bae-427e-45a6-904e-6c821447cc46", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "4efab22c-1892-4013-8406-5e5d924a8a21:panel_4efab22c-1892-4013-8406-5e5d924a8a21", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "4c3c1b29-100e-474c-8290-9470684ae407:panel_4c3c1b29-100e-474c-8290-9470684ae407", + "type": "visualization" + }, + { + "id": "200609c0-79f0-11ea-ae7f-13c5d6e410a0", + "name": "b4501df0-d759-4513-9e87-5dd8eefe4a4f:panel_b4501df0-d759-4513-9e87-5dd8eefe4a4f", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "4fbff0ec-b3a6-4ee7-8734-9b177c3e51c6:panel_4fbff0ec-b3a6-4ee7-8734-9b177c3e51c6", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "13d9982e-2745-44b1-af94-fa4b9f6761a9:panel_13d9982e-2745-44b1-af94-fa4b9f6761a9", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "efa18320-9650-4bfe-9418-ac29b7979f70:panel_efa18320-9650-4bfe-9418-ac29b7979f70", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "1f03bc70-0545-4a3a-bebc-ad477674b841:panel_1f03bc70-0545-4a3a-bebc-ad477674b841", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "d766ce3a-9ec5-4ead-8698-6a2e66e729bb:panel_d766ce3a-9ec5-4ead-8698-6a2e66e729bb", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "de93deb0-6c16-45ae-8fae-de0b2e1c4ae0:panel_de93deb0-6c16-45ae-8fae-de0b2e1c4ae0", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "b93cc5e1-084a-42d9-9958-a3f569573d43:panel_b93cc5e1-084a-42d9-9958-a3f569573d43", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "0b6c380f-3536-4f03-8dbd-95c53be69263:panel_0b6c380f-3536-4f03-8dbd-95c53be69263", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "5c68b67a-ac42-48b8-85de-2409aaa0cdc6:panel_5c68b67a-ac42-48b8-85de-2409aaa0cdc6", + "type": "visualization" + }, + { + "id": "200609c0-79f0-11ea-ae7f-13c5d6e410a0", + "name": "098a69b8-c9a0-40c8-8703-62838e0ec4a9:panel_098a69b8-c9a0-40c8-8703-62838e0ec4a9", + "type": "visualization" + }, + { + "id": "ef8757d0-7ac2-11ea-b69c-cf0d7935cd67", + "name": "a0f4b9ce-2e36-4d22-8dd9-8988f1a3b883:panel_a0f4b9ce-2e36-4d22-8dd9-8988f1a3b883", + "type": "visualization" + }, + { + "id": "4a36acd0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "eb651411-ea02-4506-a674-f0125d0b2a4a:panel_eb651411-ea02-4506-a674-f0125d0b2a4a", + "type": "visualization" + }, + { + "id": "6091ead0-1c6d-11ea-a100-8589bb9d7c6b", + "name": "8ec9b67a-5d08-4006-bccc-a7341b88bb63:panel_8ec9b67a-5d08-4006-bccc-a7341b88bb63", + "type": "search" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "1201144d-5c9c-4015-89a3-0cb803405986:panel_1201144d-5c9c-4015-89a3-0cb803405986", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "913c1c46-ded4-4e04-81ff-e683f725d3a5:panel_913c1c46-ded4-4e04-81ff-e683f725d3a5", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "f49dfd93-ce95-4a65-b9ec-531f340da083:panel_f49dfd93-ce95-4a65-b9ec-531f340da083", + "type": "visualization" + }, + { + "id": "200609c0-79f0-11ea-ae7f-13c5d6e410a0", + "name": "0705993c-492c-4ce0-83e0-a481c90bd432:panel_0705993c-492c-4ce0-83e0-a481c90bd432", + "type": "visualization" + }, + { + "id": "132ab9c0-7ac3-11ea-b69c-cf0d7935cd67", + "name": "02de39d3-6839-4198-94e3-cc91f61d0c6e:panel_02de39d3-6839-4198-94e3-cc91f61d0c6e", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "e6b958fa-931f-4358-94fc-07934419066d:panel_e6b958fa-931f-4358-94fc-07934419066d", + "type": "visualization" + }, + { + "id": "1bba55f0-507e-11eb-9c0d-97106882b997", + "name": "e6d70fc7-1bdc-4743-9a15-615dff91a5c1:panel_e6d70fc7-1bdc-4743-9a15-615dff91a5c1", + "type": "visualization" + }, + { + "id": "200609c0-79f0-11ea-ae7f-13c5d6e410a0", + "name": "9db5f35e-ab94-4a5a-8c0f-70bf2aa095aa:panel_9db5f35e-ab94-4a5a-8c0f-70bf2aa095aa", + "type": "visualization" + }, + { + "id": "e5bfe380-ac3e-11eb-8f24-bffe9ba4af2b", + "name": "e985d8b0-4a76-46d0-af01-3edab5995b97:panel_e985d8b0-4a76-46d0-af01-3edab5995b97", + "type": "search" + } + ], + "type": "dashboard", + "updated_at": "2021-05-03T18:39:45.983Z" + } + } +} diff --git a/yarn.lock b/yarn.lock index 0c13f2803cde2..b586ba0193b70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5599,13 +5599,6 @@ resolved "https://registry.yarnpkg.com/@types/proper-lockfile/-/proper-lockfile-3.0.1.tgz#dd770a2abce3adbcce3bd1ed892ce2f5f17fbc86" integrity sha512-ODOjqxmaNs0Zkij+BJovsNJRSX7BJrr681o8ZnNTNIcTermvVFzLpz/XFtfg3vNrlPVTJY1l4e9h2LvHoxC1lg== -"@types/puppeteer@^5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.1.tgz#8d0075ad7705e8061b06df6a9a3abc6ca5fb7cd9" - integrity sha512-mEytIRrqvsFgs16rHOa5jcZcoycO/NSjg1oLQkFUegj3HOHeAP1EUfRi+eIsJdGrx2oOtfN39ckibkRXzs+qXA== - dependencies: - "@types/node" "*" - "@types/q@^1.5.1": version "1.5.4" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" @@ -11654,16 +11647,16 @@ detective@^5.0.2, detective@^5.2.0: defined "^1.0.0" minimist "^1.1.1" -devtools-protocol@0.0.809251: - version "0.0.809251" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.809251.tgz#300b3366be107d5c46114ecb85274173e3999518" - integrity sha512-pf+2OY6ghMDPjKkzSWxHMq+McD+9Ojmq5XVRYpv/kPd9sTMQxzEt21592a31API8qRjro0iYYOc3ag46qF/1FA== - devtools-protocol@0.0.818844: version "0.0.818844" resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.818844.tgz#d1947278ec85b53e4c8ca598f607a28fa785ba9e" integrity sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg== +devtools-protocol@0.0.854822: + version "0.0.854822" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.854822.tgz#eac3a5260a6b3b4e729a09fdc0c77b0d322e777b" + integrity sha512-xd4D8kHQtB0KtWW0c9xBZD5LVtm9chkMOfs/3Yn01RhT/sFIsVtzTtypfKoFfWBaL+7xCYLxjOLkhwPXaX/Kcg== + dezalgo@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -22454,19 +22447,19 @@ puppeteer@^5.3.1: unbzip2-stream "^1.3.3" ws "^7.2.3" -"puppeteer@npm:@elastic/puppeteer@5.4.1-patch.1": - version "5.4.1-patch.1" - resolved "https://registry.yarnpkg.com/@elastic/puppeteer/-/puppeteer-5.4.1-patch.1.tgz#61af43ec7df47d1042c8708c386cfa7af76e08f7" - integrity sha512-I4JbNmQHZkE72TPNdipND8GnsEBnqzuksxPSAT25qvudShuuzdY9TwNBQ65IJwPD/pjlpx7fUIUmFyvTHwlxhQ== +puppeteer@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-8.0.0.tgz#a236669118aa795331c2d0ca19877159e7664705" + integrity sha512-D0RzSWlepeWkxPPdK3xhTcefj8rjah1791GE82Pdjsri49sy11ci/JQsAO8K2NRukqvwEtcI+ImP5F4ZiMvtIQ== dependencies: debug "^4.1.0" - devtools-protocol "0.0.809251" + devtools-protocol "0.0.854822" extract-zip "^2.0.0" - https-proxy-agent "^4.0.0" + https-proxy-agent "^5.0.0" node-fetch "^2.6.1" pkg-dir "^4.2.0" progress "^2.0.1" - proxy-from-env "^1.0.0" + proxy-from-env "^1.1.0" rimraf "^3.0.2" tar-fs "^2.0.0" unbzip2-stream "^1.3.3"