Top Banner
Effectively Monitoring Client-Side Performance MobileTea, Rome | @AndrewRota
96

Client-Side Performance Monitoring (MobileTea, Rome)

Apr 05, 2017

Download

Technology

Andrew Rota
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Client-Side Performance Monitoring (MobileTea, Rome)

Effectively Monitoring Client-Side Performance

MobileTea, Rome | @AndrewRota

Page 2: Client-Side Performance Monitoring (MobileTea, Rome)

1. Client-Side Performance 2. Collect + Monitor 3. Effectively

Page 3: Client-Side Performance Monitoring (MobileTea, Rome)

Andrew RotaSoftware Engineer, .

@AndrewRota .

Boston, MA

Page 4: Client-Side Performance Monitoring (MobileTea, Rome)

Web Performance

Page 5: Client-Side Performance Monitoring (MobileTea, Rome)
Page 6: Client-Side Performance Monitoring (MobileTea, Rome)
Page 7: Client-Side Performance Monitoring (MobileTea, Rome)
Page 8: Client-Side Performance Monitoring (MobileTea, Rome)
Page 9: Client-Side Performance Monitoring (MobileTea, Rome)
Page 10: Client-Side Performance Monitoring (MobileTea, Rome)
Page 11: Client-Side Performance Monitoring (MobileTea, Rome)
Page 12: Client-Side Performance Monitoring (MobileTea, Rome)
Page 13: Client-Side Performance Monitoring (MobileTea, Rome)
Page 14: Client-Side Performance Monitoring (MobileTea, Rome)
Page 15: Client-Side Performance Monitoring (MobileTea, Rome)
Page 16: Client-Side Performance Monitoring (MobileTea, Rome)

Client-Side Web Performance

Page 17: Client-Side Performance Monitoring (MobileTea, Rome)

Measuring Performance

Page 18: Client-Side Performance Monitoring (MobileTea, Rome)

Navigation

Render

Additional Resources

Interaction

Page 19: Client-Side Performance Monitoring (MobileTea, Rome)

Navigation

Render

Additional Resources

Interaction

Page 20: Client-Side Performance Monitoring (MobileTea, Rome)

Navigation

Render

Additional Resources

Interaction

Page 21: Client-Side Performance Monitoring (MobileTea, Rome)

Navigation

Render

Additional Resources

Interaction

Page 22: Client-Side Performance Monitoring (MobileTea, Rome)

There’s no single metric for measuring web

performance

Page 23: Client-Side Performance Monitoring (MobileTea, Rome)

Performance Metric Sources

1. Observational data 2. Browser devtools 3. Browser reported metrics

Page 24: Client-Side Performance Monitoring (MobileTea, Rome)

Observational Data

Page 25: Client-Side Performance Monitoring (MobileTea, Rome)

Performance Metric Sources

1. Observational data 2. Browser devtools 3. Browser reported metrics

Page 26: Client-Side Performance Monitoring (MobileTea, Rome)

Browser Profiling Metrics

Page 27: Client-Side Performance Monitoring (MobileTea, Rome)

Performance Metric Sources

1. Observational data 2. Browser devtools 3. Browser reported metrics

Page 28: Client-Side Performance Monitoring (MobileTea, Rome)

Performance Metric Sources

1. Observational data 2. Browser devtools 3. Browser reported metrics

• Navigation Timing API • Paint metrics • Custom Metrics

Page 29: Client-Side Performance Monitoring (MobileTea, Rome)

Navigation Timing API

Page 30: Client-Side Performance Monitoring (MobileTea, Rome)

navigationStart

responseStartresponseEnd

domInteractive

domContentLoaded

domComplete

Page 31: Client-Side Performance Monitoring (MobileTea, Rome)

Paint Metrics

window.performance.timing.msFirstPaint

window.chrome.loadTimes().firstPaintTime

Internet Explorer

Chrome

Page 32: Client-Side Performance Monitoring (MobileTea, Rome)

firstPaint

Page 33: Client-Side Performance Monitoring (MobileTea, Rome)

Custom Metricswindow.performance.now()

Page 34: Client-Side Performance Monitoring (MobileTea, Rome)

Custom Metricswindow.performance.mark(‘mainImageLoaded’)

window.performance .getEntriesByName(‘mainImageLoaded’)[0] .startTime

Page 35: Client-Side Performance Monitoring (MobileTea, Rome)

mainImageLoaded

tableSorted

Page 36: Client-Side Performance Monitoring (MobileTea, Rome)

Making Metrics Meaningful

Page 37: Client-Side Performance Monitoring (MobileTea, Rome)
Page 38: Client-Side Performance Monitoring (MobileTea, Rome)

Traditional Site Visit Lifecycle

Page 39: Client-Side Performance Monitoring (MobileTea, Rome)

Page 1

Page 2

Page 3

Page 4

Page 40: Client-Side Performance Monitoring (MobileTea, Rome)

But what about single page applications (SPAs)?

Page 41: Client-Side Performance Monitoring (MobileTea, Rome)

Page 1

Page 2

Page 3

Page 4

Page 42: Client-Side Performance Monitoring (MobileTea, Rome)

SPAs can improve performance, but complicate

performance metrics

Page 43: Client-Side Performance Monitoring (MobileTea, Rome)

With SPAs, 1) instrument router actions, and 2) know that metrics won’t be 1:1.

Page 44: Client-Side Performance Monitoring (MobileTea, Rome)

Determine meaningful abstract metrics on top of low-level browser/app metrics

Page 45: Client-Side Performance Monitoring (MobileTea, Rome)

Can we automate, collect, and monitor these metrics?

Page 46: Client-Side Performance Monitoring (MobileTea, Rome)

1. Client-Side Performance 2. Collect + Monitor 3. Effectively

Page 47: Client-Side Performance Monitoring (MobileTea, Rome)

1. Real User Monitoring (RUM)

2. Synthetic

Collecting Performance Metrics

Page 48: Client-Side Performance Monitoring (MobileTea, Rome)

RUM Performance Metrics

Users Collect Metrics

Page 49: Client-Side Performance Monitoring (MobileTea, Rome)

Sources for RUM Metrics1. Observational data 2. Browser devtools 3. Browser reported metrics

• Navigation Timing API • Paint metrics • Custom Metrics

Page 50: Client-Side Performance Monitoring (MobileTea, Rome)

Tools for RUM Metrics

Page 51: Client-Side Performance Monitoring (MobileTea, Rome)

Browser reported metrics Collect Metrics

Send Metrics (XHR)

Page 52: Client-Side Performance Monitoring (MobileTea, Rome)

Tools for RUM Metrics

• Custom JavaScript • Open source JS libraries

• github.com/lognormal/boomerang • Third party monitoring services

Page 53: Client-Side Performance Monitoring (MobileTea, Rome)

Synthetic Performance Metrics

Automated Test Collect Metrics

Page 54: Client-Side Performance Monitoring (MobileTea, Rome)

Sources for Synthetic Metrics

1. Observational data 2. Browser devtools 3. Browser reported metrics

• Navigation Timing API • Paint metrics • Custom Metrics

Page 55: Client-Side Performance Monitoring (MobileTea, Rome)

Tools for Synthetic Performance Metrics

Scheduler Browser + Test Runner

Page 56: Client-Side Performance Monitoring (MobileTea, Rome)

Schedulers

• Cron

> 0 * * * * /path/to/script.sh

Page 57: Client-Side Performance Monitoring (MobileTea, Rome)

Schedulers

• Cron

• Continuous integration server • Jenkins

> 0 * * * * /path/to/script.sh

Page 58: Client-Side Performance Monitoring (MobileTea, Rome)

Synthetic test runners• Phantomas • Browser-Perf • WebPagetest • Lighthouse

Page 59: Client-Side Performance Monitoring (MobileTea, Rome)

Phantomas

Headless Browsers

Page 60: Client-Side Performance Monitoring (MobileTea, Rome)

Phantomas> phantomas http://reddit.com

{ "metrics": { "requests": 73, "bodySize": 580491, "contentLength": 629382, "timeToFirstByte": 94, "timeToLastByte": 105, "DOMqueries": 247, "firstPaint": 0, "domInteractive": 215, "domContentLoaded": 213, "domContentLoadedEnd": 355, "domComplete": 792, "httpsRequests": [ "https://www.reddit.com/", "https://www.redditstatic.com/reddit-init.en.qq9nT0inXvw.js", "https://www.redditstatic.com/reddit.en.xlHlxcJziiU.js", "https://www.redditstatic.com/reddit.ooBJpEoO9vY.css", "https://www.google-analytics.com/analytics.js" ] // … and more! } }

Page 61: Client-Side Performance Monitoring (MobileTea, Rome)

Phantomas> phantomas http://reddit.com

{ "metrics": { "requests": 73, "bodySize": 580491, "contentLength": 629382, "timeToFirstByte": 94, "timeToLastByte": 105, "DOMqueries": 247, "firstPaint": 0, "domInteractive": 215, "domContentLoaded": 213, "domContentLoadedEnd": 355, "domComplete": 792, "httpsRequests": [ "https://www.reddit.com/", "https://www.redditstatic.com/reddit-init.en.qq9nT0inXvw.js", "https://www.redditstatic.com/reddit.en.xlHlxcJziiU.js", "https://www.redditstatic.com/reddit.ooBJpEoO9vY.css", "https://www.google-analytics.com/analytics.js" ] // … and more! } }

Page 62: Client-Side Performance Monitoring (MobileTea, Rome)

Phantomas> phantomas http://reddit.com

{ "metrics": { "requests": 73, "bodySize": 580491, "contentLength": 629382, "timeToFirstByte": 94, "timeToLastByte": 105, "DOMqueries": 247, "firstPaint": 0, "domInteractive": 215, "domContentLoaded": 213, "domContentLoadedEnd": 355, "domComplete": 792, "httpsRequests": [ "https://www.reddit.com/", "https://www.redditstatic.com/reddit-init.en.qq9nT0inXvw.js", "https://www.redditstatic.com/reddit.en.xlHlxcJziiU.js", "https://www.redditstatic.com/reddit.ooBJpEoO9vY.css", "https://www.google-analytics.com/analytics.js" ] // … and more! } }

Page 63: Client-Side Performance Monitoring (MobileTea, Rome)

Phantomas> phantomas http://reddit.com

{ "metrics": { "requests": 73, "bodySize": 580491, "contentLength": 629382, "timeToFirstByte": 94, "timeToLastByte": 105, "DOMqueries": 247, "firstPaint": 0, "domInteractive": 215, "domContentLoaded": 213, "domContentLoadedEnd": 355, "domComplete": 792, "httpsRequests": [ "https://www.reddit.com/", "https://www.redditstatic.com/reddit-init.en.qq9nT0inXvw.js", "https://www.redditstatic.com/reddit.en.xlHlxcJziiU.js", "https://www.redditstatic.com/reddit.ooBJpEoO9vY.css", "https://www.google-analytics.com/analytics.js" ] // … and more! } }

Page 64: Client-Side Performance Monitoring (MobileTea, Rome)

Browser-Perf

Page 65: Client-Side Performance Monitoring (MobileTea, Rome)

Browser-Perf> browser-perf http://reddit.com --selenium=selenium.example.com

Page 66: Client-Side Performance Monitoring (MobileTea, Rome)

Browser-Perf> browser-perf http://reddit.com --selenium=selenium.example.com

Page 67: Client-Side Performance Monitoring (MobileTea, Rome)

Browser-Perf> browser-perf http://reddit.com --selenium=selenium.example.com

Page 68: Client-Side Performance Monitoring (MobileTea, Rome)

Browser-Perf> browser-perf http://reddit.com --selenium=selenium.example.com

Page 69: Client-Side Performance Monitoring (MobileTea, Rome)

WebPagetesthttp://www.webpagetest.org/

Page 70: Client-Side Performance Monitoring (MobileTea, Rome)

WebPagetesthttp://www.webpagetest.org/

Page 71: Client-Side Performance Monitoring (MobileTea, Rome)

WebPagetest

Can run on mobile devices

Page 72: Client-Side Performance Monitoring (MobileTea, Rome)

WPT: Speed IndexPaint Time of “Above the Fold” Content

( )

Source: WebPagetest

Page 73: Client-Side Performance Monitoring (MobileTea, Rome)

Calculating Speed Index

1. Take the duration until the page is visually complete, above the fold

2. Separate it into 100ms intervals 3. For each interval, assign it a “percent

visually complete” 4. Invert that percentage so it’s “percent

incomplete” or “percent remaining” 5. Multiply that by the interval length (100ms) 6. Sum all of the intervals. Speed Index!

Mobile viewport size will affect this metric!

Page 74: Client-Side Performance Monitoring (MobileTea, Rome)

Lighthouse

Page 75: Client-Side Performance Monitoring (MobileTea, Rome)
Page 76: Client-Side Performance Monitoring (MobileTea, Rome)

Lighthouse

Page 77: Client-Side Performance Monitoring (MobileTea, Rome)

Lighthouse + WPT?!

https://github.com/WPO-Foundation/webpagetest/pull/825

Page 78: Client-Side Performance Monitoring (MobileTea, Rome)

Storage and Monitoring

Page 79: Client-Side Performance Monitoring (MobileTea, Rome)

• Aggregation • Data storage + queries • Visualization • Alerts + Notification

Storing and Monitoring

Page 80: Client-Side Performance Monitoring (MobileTea, Rome)

Aggregation via StatsD

Page 81: Client-Side Performance Monitoring (MobileTea, Rome)

Storage + Queries with Graphite

mySite.homepage.phantomas.domComplete

Page 82: Client-Side Performance Monitoring (MobileTea, Rome)

Visualization with Grafana

Page 83: Client-Side Performance Monitoring (MobileTea, Rome)

Visualization with Grafana

Source: play.grafana.org/

Page 84: Client-Side Performance Monitoring (MobileTea, Rome)

1. Client-Side Performance 2. Collect + Monitor 3. Effectively

Page 85: Client-Side Performance Monitoring (MobileTea, Rome)

Effective Monitoring

• Reduce noise • Be aware of environment differences • Beware skewed data • Make data actionable • Utilize data

Page 86: Client-Side Performance Monitoring (MobileTea, Rome)

Reduce Noise

• Isolate third party scripts and external services

• Control conditional code paths (A/B tests, etc.)

Page 87: Client-Side Performance Monitoring (MobileTea, Rome)

Be aware of environment differences

• Especially in mobile

• Bandwidth differences • CPU/memory differences

Page 88: Client-Side Performance Monitoring (MobileTea, Rome)

Pyramid of Environment Parity

Mock user agent

Throttle network connection, CPU

Device simulator

Real device

Page 89: Client-Side Performance Monitoring (MobileTea, Rome)

Pyramid of Environment Parity

Mock user agent

Throttle network connection, CPU

Device simulator

Real device

Acc

urac

yEase / Speed

Page 90: Client-Side Performance Monitoring (MobileTea, Rome)

Beware Skewed Data

• Observer effect

• Noisy neighbors

Page 91: Client-Side Performance Monitoring (MobileTea, Rome)

Make Data Actionable

Know what changes will affect each of your metrics

Page 92: Client-Side Performance Monitoring (MobileTea, Rome)

Do something with this data!

Page 93: Client-Side Performance Monitoring (MobileTea, Rome)

Utilize Data

• Agree on performance metrics • Agree on performance goals • Allocate time and resources

to achieving these goals

Page 94: Client-Side Performance Monitoring (MobileTea, Rome)

Performance is a means to an end:

Remember

Page 95: Client-Side Performance Monitoring (MobileTea, Rome)

Performance is a means to an end:

user experience

Remember

Page 96: Client-Side Performance Monitoring (MobileTea, Rome)

Andrew Rota, .

@AndrewRota .

Thanks!Recommend Resources

• bit.ly/google_rails • bit.ly/webpagetest_docs • bit.ly/browser_perf • bit.ly/statsdcc • bit.ly/phantomas_js • graphite.readthedocs.io