Setup: Use the docker compose file to run Sitespeed + Grafana per https://www.sitespeed.io/documentation/sitespeed.io/performance-dashboard/#docker-compose-file
Windows 10 (build 15063.674)
Good case: "/research"
Data appears in Grafana for the "/research" url.
Everything works great (sitespeed/WPT files written to dish, Grafana dashboards are populated with Sitespeed and WPT data)
docker-compose run sitespeed.io https://www.payscale.com/research --graphite.host=graphite --webpagetest.key WPT_KEY_HERE --webpagetest.runs 1 --video --speedIndex --firstParty ".*payscale.*"
Bad case 1: "/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate"
Expected: Grafana contains data
Actual: Sitespeed container crashes at ffprobe
Params are identical to the good case above and only the url is different
WPT screenshots and movies are written to disk
Sitespeed files are NOT written to disk.
docker-compose run sitespeed.io https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate --graphite.host=graphite --webpagetest.key WPT_KEY_HERE --webpagetest.runs 1 --video --speedIndex --firstParty ".*payscale.*"
Google Chrome 60.0.3112.78
Mozilla Firefox 54.0
[2017-11-16 18:49:15] INFO: Versions OS: linux 4.9.49-moby nodejs: v6.11.1 sitespeed.io: 5.6.5 browsertime: 1.9.4 coach: 0.36.0
[2017-11-16 18:49:16] INFO: Sending url https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate to test on https://www.webpagetest.org
[2017-11-16 18:49:16] INFO: Starting chrome for analysing https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate 3 time(s)
[2017-11-16 18:49:16] INFO: Testing url https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate run 1
[2017-11-16 18:49:36] INFO: Got https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate analysed with id 171116_72_bd69254d42bcbd0106f46304a32936c9 from https://www.webpagetest.org
[2017-11-16 18:49:39] ERROR: Error: Command failed: ffprobe -f lavfi -i movie='/sitespeed.io/sitespeed-result/www.payscale.com/2017-11-16-18-49-15/pages/www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate/data/video/0.mp4',signalstats -show_entries frame_tags=lavfi.signalstats.SATAVG -v quiet -print_format json
{
}
at Promise.all.then.arr (/usr/src/app/node_modules/execa/index.js:208:11)
at process._tickCallback (internal/process/next_tick.js:109:7)
From previous event:
at Promise.resolve.tap.tap.tap.tap.tap.tap.tap.tap.tap.tap.results (/usr/src/app/node_modules/browsertime/lib/core/engine.js:363:19)
From previous event:
at runIteration (/usr/src/app/node_modules/browsertime/lib/core/engine.js:362:10)
at Promise.reduce (/usr/src/app/node_modules/browsertime/lib/core/engine.js:409:27)
From previous event:
at Promise.resolve.tap.tap.tap.tap.result (/usr/src/app/node_modules/browsertime/lib/core/engine.js:406:17)
at runCallback (timers.js:672:20)
at tryOnImmediate (timers.js:645:5)
at processImmediate [as _immediateCallback] (timers.js:617:5)
From previous event:
at Engine.run (/usr/src/app/node_modules/browsertime/lib/core/engine.js:405:8)
at engine.start.then (/usr/src/app/lib/plugins/browsertime/analyzer.js:95:26)
From previous event:
at Object.analyzeUrl (/usr/src/app/lib/plugins/browsertime/analyzer.js:95:8)
at storageManager.createDirForUrl.then.then (/usr/src/app/lib/plugins/browsertime/index.js:173:32)
at /usr/src/app/node_modules/mkdirp/index.js:30:20
at FSReqWrap.oncomplete (fs.js:123:15)
From previous event:
at Object.processMessage (/usr/src/app/lib/plugins/browsertime/index.js:173:12)
at queue.process.message (/usr/src/app/lib/support/queueHandler.js:192:32)
at drainItem (/usr/src/app/node_modules/concurrent-queue/index.js:96:21)
at Immediate.drain (/usr/src/app/node_modules/concurrent-queue/index.js:77:84)
at runCallback (timers.js:672:20)
at tryOnImmediate (timers.js:645:5)
at processImmediate [as _immediateCallback] (timers.js:617:5)
[2017-11-16 18:49:40] ERROR: TypeError: /usr/src/app/lib/plugins/html/templates/pages.pug:16
14| +numberCell('Requests', p.requests)
15| if options.speedIndex
> 16| +numberCell('First Visual Change', b.visualMetrics[0].FirstVisualChange)
17| +numberCell('Speed Index', b.visualMetrics[0].SpeedIndex)
18| +numberCell('Last Visual Change', b.visualMetrics[0].LastVisualChange)
19| else
Cannot read property '0' of undefined
14| +numberCell('Requests', p.requests)
15| if options.speedIndex
> 16| +numberCell('First Visual Change', b.visualMetrics[0].FirstVisualChange)
17| +numberCell('Speed Index', b.visualMetrics[0].SpeedIndex)
18| +numberCell('Last Visual Change', b.visualMetrics[0].LastVisualChange)
19| else
Cannot read property '0' of undefined
at Object.eval (eval at wrap (/usr/src/app/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:188:64)
at Object.pug_interp [as rows] (eval at wrap (/usr/src/app/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:235:4)
at eval (eval at wrap (/usr/src/app/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:387:19)
at template (eval at wrap (/usr/src/app/node_modules/pug-runtime/wrap.js:6:10), <anonymous>:420:184)
at Object.renderTemplate (/usr/src/app/lib/plugins/html/renderer.js:27:37)
at HTMLBuilder._renderSummaryPage (/usr/src/app/lib/plugins/html/htmlBuilder.js:288:16)
at Object.keys.map.name (/usr/src/app/lib/plugins/html/htmlBuilder.js:124:12)
at Array.map (native)
at HTMLBuilder.render (/usr/src/app/lib/plugins/html/htmlBuilder.js:123:54)
at Object.close (/usr/src/app/lib/plugins/html/index.js:21:29)
at Promise.resolve.filter.map.plugin (/usr/src/app/lib/sitespeed.js:45:47)
From previous event:
at runOptionalFunction (/usr/src/app/lib/sitespeed.js:45:6)
at runOptionalFunction.then.then.tap.errors (/usr/src/app/lib/sitespeed.js:152:15)
From previous event:
at loader.loadPlugins.then.plugins (/usr/src/app/lib/sitespeed.js:151:14)
at runCallback (timers.js:672:20)
at tryOnImmediate (timers.js:645:5)
at processImmediate [as _immediateCallback] (timers.js:617:5)
From previous event:
at storageManager.createDataDir.then.then.then.then.then.pluginNames (/usr/src/app/lib/sitespeed.js:129:48)
From previous event:
at Object.run (/usr/src/app/lib/sitespeed.js:128:8)
at Object.<anonymous> (/usr/src/app/bin/sitespeed.js:30:4)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:389:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:504:3
md5-38c02436837f7675387369f313dcdda1
C:\docker>docker-compose run sitespeed.io https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate --graphite.host=graphite --webpagetest.key WPT_KEY_HERE --webpagetest.runs 1 --speedIndex
md5-58471eae40738141fdbe7e04e1819f99
Google Chrome 60.0.3112.78
Mozilla Firefox 54.0
[2017-11-16 18:40:20] INFO: Versions OS: linux 4.9.49-moby nodejs: v6.11.1 sitespeed.io: 5.6.5 browsertime: 1.9.4 coach: 0.36.0
[2017-11-16 18:40:20] INFO: Sending url https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate to test on https://www.webpagetest.org
[2017-11-16 18:40:20] INFO: Starting chrome for analysing https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate 3 time(s)
[2017-11-16 18:40:20] INFO: Testing url https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate run 1
[2017-11-16 18:40:37] INFO: Testing url https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate run 2
[2017-11-16 18:40:41] INFO: Got https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate analysed with id 171116_Q1_84e82c382be5f41fbb1f76c11916fced from https://www.webpagetest.org
[2017-11-16 18:41:14] INFO: Testing url https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate run 3
[2017-11-16 18:41:35] INFO: 272 requests, 1590.27 kb, backEndTime: 317ms (±14.38ms), firstPaint: 1.10s (±18.19ms), firstVisualChange: 400ms (±13.68ms), DOMContentLoaded: 2.23s (±124.54ms), Load: 10.98s (±2.31s), speedIndex: 2104 (±170.52), visualComplete85: 2.16s (±109.96ms), lastVisualChange: 11.54s (±2.49s), rumSpeedIndex: 1435 (±100.60) (3 runs)
[2017-11-16 18:41:40] INFO: HTML stored in /sitespeed.io/sitespeed-result/www.payscale.com/2017-11-16-18-40-20
[2017-11-16 18:41:40] INFO: Finished analysing https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate
Files written to C:dockersitespeed-resultwww.payscale.com for the cases above
bad-case-1-2017-11-16-18-49-15.zip
bad-case-2-2017-11-16-18-40-20.zip
good-case-2017-11-16-17-59-57.zip
And the Grafana dashboard for the bad cases

Hi @alexdangelo thanks for reporting!
@beenanner could this be a filename issue just for Windows? I haven't had time yet to test on Linux.
For Graphite, the workaround I think is to give the URL a name https://www.sitespeed.io/documentation/sitespeed.io/configuration/#analyze-by-urls "Another feature of the plain text file is you can add aliases ..."
Best
Peter
Thanks for the quick response and suggestion. No luck with using a url file with an alias for the url itself unfortunately. The article you pointed to calls out using "docker run" but I haven't gotten that to work at all with any url, but "docker-compose" has been working well.
C:\docker>docker-compose run sitespeed.io urls.txt --graphite.host=graphite --webpagetest.key WPT_KEY_HERE --webpagetest.runs 1 --video --speedIndex --firstParty ".*payscale.*"
Google Chrome 60.0.3112.78
Mozilla Firefox 54.0
/usr/src/app/lib/support/cliUtil.js:32
throw new Error(`Couldn't find url file at ${filePath}`);
^
Error: Couldn't find url file at /sitespeed.io/urls.txt
at Object.getURLs (/usr/src/app/lib/support/cliUtil.js:32:19)
at Object.parseCommandLine (/usr/src/app/lib/support/cli.js:683:19)
at Object.<anonymous> (/usr/src/app/bin/sitespeed.js:22:18)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:389:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:504:3
urls.txt
https://www.payscale.com/research/US/Job=Registered_Nurse_(RN)/Hourly_Rate Research-US-Job-RN
The issue here is that the external url file can't be found (per stack dump). I've tried giving all sorts of different paths (absolute, relative) and put the urls.txt file in different directories (root, current directory, creating a directory like c:sitespeed.iourls.txt, for example).
Examples:
c:\docker>docker-compose run sitespeed.io ./urls.txt
c:\docker>docker-compose run sitespeed.io c:/sitespeed.io/urls.txt
c:\docker>docker-compose run sitespeed.io c:\sitespeed.io\urls.txt
c:\docker>docker-compose run sitespeed.io c:\docker\urls.txt
Using the instructions directly (on Windows) from https://www.sitespeed.io/documentation/sitespeed.io/configuration/#analyze-by-urls here's what I see:
C:\docker>docker run --privileged --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io urls.txt
docker: Error response from daemon: create $(pwd): "$(pwd)" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
See 'docker run --help'.
so I've tried variations but get the "Couldn't find url file..." error (again, clearly I'm not passing in the correct path on Windows). One example is as follows
docker run --privileged --shm-size=1g --rm -v c:/sitespeed.io sitespeedio/sitespeed.io urls.txt
I'll keep exploring Docker documentation to see if I can find an example of an equivalent for Windows too.
@alexdangelo yep you need to map the volume, I think you need to have an absolute path: https://docs.docker.com/docker-for-windows/
Also not sure how it works with docker-compose (you might need to specify the volume inside the compose file).
The bug for = must be within sitespeed.io though I guess, I'll have a look tomorrow see if I can reproduce it (late here now).
Best
Peter
Yep I could reproduce the first bug with _Command failed: ffprobe_ - we need to check how we can fix that in Browsertime.
(accidentally closed this issue so I reopened it)
I also opened #1798 to track an issue relating to docker run and graphite related to the comment in the middle of this thread.
ffprobe can't handle = in the filename, I've escaped it now and it works. I hope we can roll it out next week.
The fix is pushed to master.
Awesome, thanks so much @soulgalore .
released this yesterday, please re-open if you still get the problem
I'm having a similar issue running 6.1.3 with url:s with spaces:
6.1.3: Pulling from sitespeedio/sitespeed.io
[2017-12-19 08:12:26] INFO: Testing url https://www.ica.se/handla/kategori/gronsaker-id_198/#s=maxi-ica-stormarknad-solna-id_11920/ run 3
[2017-12-19 08:12:41] INFO: 53 requests, 2227.26 kb, backEndTime: 302ms (±29.36ms), firstPaint: 743ms (±10.14ms), firstVisualChange: 2.79s (±31.35ms), DOMContentLoaded: 1.32s (±44.52ms), Load: 1.58s (±42.06ms), speedIndex: 2789 (±31.35), visualComplete85: 2.79s (±31.35ms), lastVisualChange: 2.79s (±31.35ms), rumSpeedIndex: 1109 (±35.91) (3 runs)
[2017-12-19 08:12:42] ERROR: TypeError: Cannot read property 'response' of undefined
at har.log.entries.forEach.entry (/usr/src/app/node_modules/pagexray/lib/index.js:91:41)
at Array.forEach (<anonymous>)
at Object.convert (/usr/src/app/node_modules/pagexray/lib/index.js:78:21)
at Object.processMessage (/usr/src/app/lib/plugins/coach/index.js:104:38)
at queue.process.message (/usr/src/app/lib/core/queueHandler.js:210:32)
at drainItem (/usr/src/app/node_modules/concurrent-queue/index.js:96:21)
at Immediate.drain (/usr/src/app/node_modules/concurrent-queue/index.js:77:84)
at runCallback (timers.js:789:20)
at tryOnImmediate (timers.js:751:5)
at processImmediate [as _immediateCallback] (timers.js:722:5)
[2017-12-19 08:12:42] ERROR: TypeError: Cannot read property 'response' of undefined
at har.log.entries.forEach.entry (/usr/src/app/node_modules/pagexray/lib/index.js:91:41)
at Array.forEach (<anonymous>)
at Object.convert (/usr/src/app/node_modules/pagexray/lib/index.js:78:21)
at Promise.resolve.then.harJson (/usr/src/app/node_modules/webcoach/lib/index.js:28:14)
From previous event:
at getPagesFromHar (/usr/src/app/node_modules/webcoach/lib/index.js:27:35)
at Object.runHarAdvice (/usr/src/app/node_modules/webcoach/lib/index.js:96:7)
at Promise.resolve.each (/usr/src/app/lib/plugins/browsertime/index.js:130:14)
at runCallback (timers.js:789:20)
at tryOnImmediate (timers.js:751:5)
at processImmediate [as _immediateCallback] (timers.js:722:5)
From previous event:
at processCoachOutput (/usr/src/app/lib/plugins/browsertime/index.js:101:54)
at storageManager.createDirForUrl.then.then.tap.tap.tap.tap.tap.tap.results (/usr/src/app/lib/plugins/browsertime/index.js:301:22)
From previous event:
at Object.processMessage (/usr/src/app/lib/plugins/browsertime/index.js:299:12)
at queue.process.message (/usr/src/app/lib/core/queueHandler.js:210:32)
at drainItem (/usr/src/app/node_modules/concurrent-queue/index.js:96:21)
at Immediate.drain [as _onImmediate] (/usr/src/app/node_modules/concurrent-queue/index.js:77:84)
at runCallback (timers.js:789:20)
at tryOnImmediate (timers.js:751:5)
at processImmediate [as _immediateCallback] (timers.js:722:5)
docker run --name sitespeed --privileged --shm-size=2g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:6.1.3 -c cable -b chrome --video --speedIndex "$@"
Hi @orjan thanks for reporting, I think the problem isn't a space, I think the Chrome HAR and how we use it in PageXray handles everything after # differently, let us fix that asap.
Best
Peter
@orjan the fix is in master, will release it late tonight or early tomorrow.
@orjan pushed the release now. 6.2.0, it will be available in a couple of minutes.