SlideShare una empresa de Scribd logo
1 de 96
Descargar para leer sin conexión
Effectively Monitoring
Client-Side Performance
MobileTea, Rome | @AndrewRota
1. Client-Side Performance
2. Collect + Monitor
3. Effectively
Andrew Rota
Software Engineer, .
@AndrewRota .
Boston, MA
Web Performance
Client-Side Web
Performance
Measuring
Performance
Navigation
Render
Additional
Resources
Interaction
Navigation
Render
Additional
Resources
Interaction
Navigation
Render
Additional
Resources
Interaction
Navigation
Render
Additional
Resources
Interaction
There’s no single metric
for measuring web
performance
Performance Metric Sources
1. Observational data
2. Browser devtools
3. Browser reported metrics
Observational Data
Performance Metric Sources
1. Observational data
2. Browser devtools
3. Browser reported metrics
Browser Profiling Metrics
Performance Metric Sources
1. Observational data
2. Browser devtools
3. Browser reported metrics
Performance Metric Sources
1. Observational data
2. Browser devtools
3. Browser reported metrics
• Navigation Timing API
• Paint metrics
• Custom Metrics
Navigation Timing API
navigationStart
responseStart
responseEnd
domInteractive
domContentLoaded
domComplete
Paint Metrics
window.performance.timing.msFirstPaint
window.chrome.loadTimes().firstPaintTime
Internet Explorer
Chrome
firstPaint
Custom Metrics
window.performance.now()
Custom Metrics
window.performance.mark(‘mainImageLoaded’)
window.performance
.getEntriesByName(‘mainImageLoaded’)[0]
.startTime
mainImageLoaded
tableSorted
Making Metrics
Meaningful
Traditional Site Visit
Lifecycle
Page
1
Page
2
Page
3
Page
4
But what about single
page applications (SPAs)?
Page
1
Page
2
Page
3
Page
4
SPAs can improve
performance, but complicate
performance metrics
With SPAs,
1) instrument router actions, and
2) know that metrics won’t be 1:1.
Determine meaningful abstract metrics
on top of low-level browser/app metrics
Can we automate, collect,
and monitor these metrics?
1. Client-Side Performance
2. Collect + Monitor
3. Effectively
1. Real User Monitoring (RUM)

2. Synthetic
Collecting Performance Metrics
RUM Performance Metrics
Users Collect Metrics
Sources for RUM Metrics
1. Observational data
2. Browser devtools
3. Browser reported metrics
• Navigation Timing API
• Paint metrics
• Custom Metrics
Tools for RUM Metrics
Browser reported
metrics
Collect Metrics
Send Metrics
(XHR)
Tools for RUM Metrics
• Custom JavaScript
• Open source JS libraries
• github.com/lognormal/boomerang
• Third party monitoring services







Synthetic Performance
Metrics
Automated Test Collect Metrics
Sources for Synthetic Metrics
1. Observational data
2. Browser devtools
3. Browser reported metrics
• Navigation Timing API
• Paint metrics
• Custom Metrics
Tools for Synthetic
Performance Metrics
Scheduler Browser + Test Runner
Schedulers
• Cron













> 0 * * * * /path/to/script.sh
Schedulers
• Cron
• Continuous integration server
• Jenkins







> 0 * * * * /path/to/script.sh
Synthetic test runners
• Phantomas
• Browser-Perf
• WebPagetest
• Lighthouse





Phantomas
Headless Browsers
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!

}

}
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!

}

}
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!

}

}
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!

}

}
Browser-Perf
Browser-Perf
> browser-perf http://reddit.com
--selenium=selenium.example.com
Browser-Perf
> browser-perf http://reddit.com
--selenium=selenium.example.com
Browser-Perf
> browser-perf http://reddit.com
--selenium=selenium.example.com
Browser-Perf
> browser-perf http://reddit.com
--selenium=selenium.example.com
WebPagetest
http://www.webpagetest.org/
WebPagetest
http://www.webpagetest.org/
WebPagetest
Can run on mobile devices
WPT: Speed Index
Paint Time of “Above the Fold” Content
( )
Source: WebPagetest
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!
Lighthouse
Lighthouse
Lighthouse + WPT?!
https://github.com/WPO-Foundation/webpagetest/pull/825
Storage and Monitoring
• Aggregation
• Data storage + queries
• Visualization
• Alerts + Notification
Storing and Monitoring
Aggregation via StatsD
Storage + Queries with Graphite
mySite.homepage.phantomas.domComplete
Visualization with Grafana
Visualization with Grafana
Source: play.grafana.org/
1. Client-Side Performance
2. Collect + Monitor
3. Effectively
Effective Monitoring
• Reduce noise
• Be aware of environment differences
• Beware skewed data
• Make data actionable
• Utilize data
Reduce Noise
• Isolate third party scripts and
external services

• Control conditional code paths (A/B
tests, etc.)
Be aware of environment
differences
• Especially in mobile

• Bandwidth differences
• CPU/memory differences
Pyramid of Environment Parity
Mock user agent
Throttle network connection, CPU
Device simulator
Real device
Pyramid of Environment Parity
Mock user agent
Throttle network connection, CPU
Device simulator
Real device
Accuracy
Ease/Speed
Beware Skewed Data
• Observer effect

• Noisy neighbors
Make Data Actionable
Know what changes will
affect each of your metrics
Do something with this data!
Utilize Data
• Agree on performance metrics
• Agree on performance goals
• Allocate time and resources
to achieving these goals
Performance is a means
to an end:
Remember
Performance is a means
to an end:
user experience
Remember
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

Más contenido relacionado

Destacado

Resultaten serious game who is john galt
Resultaten serious game who is john galtResultaten serious game who is john galt
Resultaten serious game who is john galt
Rob Oostdam
 
Onde é que nos encontramos para aonde estamos a ir e onde devemos estar
Onde é que nos encontramos para aonde estamos a ir e onde devemos estarOnde é que nos encontramos para aonde estamos a ir e onde devemos estar
Onde é que nos encontramos para aonde estamos a ir e onde devemos estar
Jorge Moreira
 

Destacado (18)

Component Based UI Architectures for the Web
Component Based UI Architectures for the WebComponent Based UI Architectures for the Web
Component Based UI Architectures for the Web
 
meetup adopting java8
meetup adopting java8meetup adopting java8
meetup adopting java8
 
Resultaten serious game who is john galt
Resultaten serious game who is john galtResultaten serious game who is john galt
Resultaten serious game who is john galt
 
The Street Kids of Calabar: A Punitive Approach is Not Enough
 The Street Kids of Calabar: A Punitive Approach is Not Enough The Street Kids of Calabar: A Punitive Approach is Not Enough
The Street Kids of Calabar: A Punitive Approach is Not Enough
 
SAPI Solutions for Distribution
SAPI Solutions for DistributionSAPI Solutions for Distribution
SAPI Solutions for Distribution
 
Iapmei incentivos industria 4.0 apt v4
Iapmei   incentivos industria 4.0 apt v4Iapmei   incentivos industria 4.0 apt v4
Iapmei incentivos industria 4.0 apt v4
 
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...
Doctor, Lawyer, Poker Player, Physicist: The Best Engineers We're Not Competi...
 
Par30 led spotlight 12w
Par30 led spotlight 12wPar30 led spotlight 12w
Par30 led spotlight 12w
 
DevLOVE仙台の野望
DevLOVE仙台の野望DevLOVE仙台の野望
DevLOVE仙台の野望
 
Onde é que nos encontramos para aonde estamos a ir e onde devemos estar
Onde é que nos encontramos para aonde estamos a ir e onde devemos estarOnde é que nos encontramos para aonde estamos a ir e onde devemos estar
Onde é que nos encontramos para aonde estamos a ir e onde devemos estar
 
専修大学文学部50年小史
専修大学文学部50年小史専修大学文学部50年小史
専修大学文学部50年小史
 
Un Kano pour Mammy
Un Kano pour MammyUn Kano pour Mammy
Un Kano pour Mammy
 
Commerce 2.x lessons learned
Commerce 2.x  lessons learnedCommerce 2.x  lessons learned
Commerce 2.x lessons learned
 
25 Quotes to Inspire your Operational Excellence Initiatives
25 Quotes to Inspire your Operational Excellence Initiatives25 Quotes to Inspire your Operational Excellence Initiatives
25 Quotes to Inspire your Operational Excellence Initiatives
 
Los presupuestos públicos en estados y municipios
Los presupuestos públicos en estados y municipiosLos presupuestos públicos en estados y municipios
Los presupuestos públicos en estados y municipios
 
Docker: uma visão geral
Docker: uma visão geralDocker: uma visão geral
Docker: uma visão geral
 
Int64
Int64Int64
Int64
 
Nomination de hervé le caignec
Nomination de hervé le caignecNomination de hervé le caignec
Nomination de hervé le caignec
 

Similar a Client-Side Performance Monitoring (MobileTea, Rome)

Browserscope oscon 2011
Browserscope oscon 2011Browserscope oscon 2011
Browserscope oscon 2011
lsimon
 

Similar a Client-Side Performance Monitoring (MobileTea, Rome) (20)

Effectively Monitoring Client-Side Performance
Effectively Monitoring Client-Side PerformanceEffectively Monitoring Client-Side Performance
Effectively Monitoring Client-Side Performance
 
Real User Monitoring: Getting Real Data from Real Users in the Real World - S...
Real User Monitoring: Getting Real Data from Real Users in the Real World - S...Real User Monitoring: Getting Real Data from Real Users in the Real World - S...
Real User Monitoring: Getting Real Data from Real Users in the Real World - S...
 
Measuring web performance
Measuring web performanceMeasuring web performance
Measuring web performance
 
Performance on a budget
Performance on a budgetPerformance on a budget
Performance on a budget
 
Using Modern Browser APIs to Improve the Performance of Your Web Applications
Using Modern Browser APIs to Improve the Performance of Your Web ApplicationsUsing Modern Browser APIs to Improve the Performance of Your Web Applications
Using Modern Browser APIs to Improve the Performance of Your Web Applications
 
AWS re:Invent 2016: Amazon CloudFront Flash Talks: Best Practices on Configur...
AWS re:Invent 2016: Amazon CloudFront Flash Talks: Best Practices on Configur...AWS re:Invent 2016: Amazon CloudFront Flash Talks: Best Practices on Configur...
AWS re:Invent 2016: Amazon CloudFront Flash Talks: Best Practices on Configur...
 
End user-experience monitoring
End user-experience monitoring End user-experience monitoring
End user-experience monitoring
 
ATAGTR2017 Unified APM: The new age performance monitoring for production sys...
ATAGTR2017 Unified APM: The new age performance monitoring for production sys...ATAGTR2017 Unified APM: The new age performance monitoring for production sys...
ATAGTR2017 Unified APM: The new age performance monitoring for production sys...
 
Edge 2014: A Modern Approach to Performance Monitoring
Edge 2014: A Modern Approach to Performance MonitoringEdge 2014: A Modern Approach to Performance Monitoring
Edge 2014: A Modern Approach to Performance Monitoring
 
How to Improve the Observability of Apache Cassandra and Kafka applications...
How to Improve the Observability of Apache Cassandra and Kafka applications...How to Improve the Observability of Apache Cassandra and Kafka applications...
How to Improve the Observability of Apache Cassandra and Kafka applications...
 
Accelerating Your Test Execution Pipeline
Accelerating Your Test Execution PipelineAccelerating Your Test Execution Pipeline
Accelerating Your Test Execution Pipeline
 
Azure Application insights - An Introduction
Azure Application insights - An IntroductionAzure Application insights - An Introduction
Azure Application insights - An Introduction
 
JUG Poznan - 2017.01.31
JUG Poznan - 2017.01.31 JUG Poznan - 2017.01.31
JUG Poznan - 2017.01.31
 
Prometheus - Utah Software Architecture Meetup - Clint Checketts
Prometheus - Utah Software Architecture Meetup - Clint CheckettsPrometheus - Utah Software Architecture Meetup - Clint Checketts
Prometheus - Utah Software Architecture Meetup - Clint Checketts
 
Performance Monitoring at Spreadshirt
Performance Monitoring at SpreadshirtPerformance Monitoring at Spreadshirt
Performance Monitoring at Spreadshirt
 
Industry Keynote at Large Scale Testing Workshop 2015
Industry Keynote at Large Scale Testing Workshop 2015Industry Keynote at Large Scale Testing Workshop 2015
Industry Keynote at Large Scale Testing Workshop 2015
 
Add observability to your django application - PyCon FR 2019
Add observability to your django application - PyCon FR 2019Add observability to your django application - PyCon FR 2019
Add observability to your django application - PyCon FR 2019
 
Debugging the Web with Fiddler
Debugging the Web with FiddlerDebugging the Web with Fiddler
Debugging the Web with Fiddler
 
Measuring CDN performance and why you're doing it wrong
Measuring CDN performance and why you're doing it wrongMeasuring CDN performance and why you're doing it wrong
Measuring CDN performance and why you're doing it wrong
 
Browserscope oscon 2011
Browserscope oscon 2011Browserscope oscon 2011
Browserscope oscon 2011
 

Más de Andrew Rota

Más de Andrew Rota (16)

Integrating React.js Into a PHP Application: Dutch PHP 2019
Integrating React.js Into a PHP Application: Dutch PHP 2019Integrating React.js Into a PHP Application: Dutch PHP 2019
Integrating React.js Into a PHP Application: Dutch PHP 2019
 
Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)
 
Getting Started with GraphQL && PHP
Getting Started with GraphQL && PHPGetting Started with GraphQL && PHP
Getting Started with GraphQL && PHP
 
Tutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHPTutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHP
 
Building a GraphQL API in PHP
Building a GraphQL API in PHPBuilding a GraphQL API in PHP
Building a GraphQL API in PHP
 
Ten practical ways to improve front-end performance
Ten practical ways to improve front-end performanceTen practical ways to improve front-end performance
Ten practical ways to improve front-end performance
 
Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP Application
 
UI Rendering at Wayfair
UI Rendering at WayfairUI Rendering at Wayfair
UI Rendering at Wayfair
 
Better PHP-Frontend Integration with Tungsten.js
Better PHP-Frontend Integration with Tungsten.jsBetter PHP-Frontend Integration with Tungsten.js
Better PHP-Frontend Integration with Tungsten.js
 
Tungsten.js: Building a Modular Framework
Tungsten.js: Building a Modular FrameworkTungsten.js: Building a Modular Framework
Tungsten.js: Building a Modular Framework
 
Why Static Type Checking is Better
Why Static Type Checking is BetterWhy Static Type Checking is Better
Why Static Type Checking is Better
 
An Exploration of Frameworks – and Why We Built Our Own
An Exploration of Frameworks – and Why We Built Our OwnAn Exploration of Frameworks – and Why We Built Our Own
An Exploration of Frameworks – and Why We Built Our Own
 
The Complementarity of React and Web Components
The Complementarity of React and Web ComponentsThe Complementarity of React and Web Components
The Complementarity of React and Web Components
 
Web Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing CombinationWeb Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing Combination
 
Bem methodology
Bem methodologyBem methodology
Bem methodology
 
Web Components and Modular CSS
Web Components and Modular CSSWeb Components and Modular CSS
Web Components and Modular CSS
 

Último

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Último (20)

Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 

Client-Side Performance Monitoring (MobileTea, Rome)