<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>The Ops Community ⚙️: Request Metrics</title>
    <description>The latest articles on The Ops Community ⚙️ by Request Metrics (@requestmetrics).</description>
    <link>https://community.ops.io/requestmetrics</link>
    <image>
      <url>https://community.ops.io/images/HcXEmUMUz7Jn08HXR2R_OqSPNknMxY06wnMEjGgaEjo/rs:fill:90:90/g:sm/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL29y/Z2FuaXphdGlvbi9w/cm9maWxlX2ltYWdl/LzMvMTk0ZGI3Zjct/MTllOS00N2ZiLTli/OWEtYTY4MWJkZWY0/OWIzLnBuZw</url>
      <title>The Ops Community ⚙️: Request Metrics</title>
      <link>https://community.ops.io/requestmetrics</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://community.ops.io/feed/requestmetrics"/>
    <language>en</language>
    <item>
      <title>Monitoring Web Performance: Why Your Synthetic Tests Aren't Telling the Whole Story</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Thu, 05 Jun 2025 15:52:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/monitoring-web-performance-why-your-synthetic-tests-arent-telling-the-whole-story-ah1</link>
      <guid>https://community.ops.io/requestmetrics/monitoring-web-performance-why-your-synthetic-tests-arent-telling-the-whole-story-ah1</guid>
      <description>&lt;p&gt;As DevOps and SRE professionals, we're obsessed with monitoring everything. We track server metrics, application performance, and infrastructure health. But when it comes to web performance monitoring, many of us are flying blind without realizing it.&lt;/p&gt;

&lt;p&gt;Here's a reality check that might surprise you: &lt;strong&gt;Google's research found that 50% of websites with perfect Lighthouse scores still fail Core Web Vitals when measured with real user data.&lt;/strong&gt; 🚨&lt;/p&gt;

&lt;p&gt;If you're relying solely on synthetic testing for web performance insights, you're missing critical production issues that could be impacting your users and your SLAs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Synthetic Testing Trap in Production Environments
&lt;/h2&gt;

&lt;p&gt;Most of us use Lighthouse, WebPageTest, or similar tools in our CI/CD pipelines. These synthetic tests are great for catching obvious performance regressions before deployment, but they have serious limitations in production monitoring:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔧 Controlled Environment Bias&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Synthetic tests run in perfect conditions: clean networks, consistent hardware, no browser extensions&lt;/li&gt;
&lt;li&gt;Real users deal with network congestion, device thermal throttling, and competing background processes&lt;/li&gt;
&lt;li&gt;Your CDN might perform differently across geographic regions, but synthetic tests typically run from a single location&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⚙️ Infrastructure Reality Gap&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Synthetic tests can't simulate real database load, API response times under actual traffic, or third-party service degradation&lt;/li&gt;
&lt;li&gt;Auto-scaling events, container restarts, and network partitions affect real users but won't show up in synthetic testing&lt;/li&gt;
&lt;li&gt;Load balancer behavior and cache performance vary significantly between synthetic and production traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📊 Missing Context for SLA Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Synthetic tests give you a single data point, not user segment analysis&lt;/li&gt;
&lt;li&gt;You can't correlate performance issues with business metrics or user behavior&lt;/li&gt;
&lt;li&gt;No visibility into how performance affects conversion rates or user retention&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real User Monitoring: Production Observability for Web Performance
&lt;/h2&gt;

&lt;p&gt;Real User Monitoring (RUM) works by embedding a lightweight JavaScript agent in your web application that collects performance data from actual user sessions. Think of it as APM for the frontend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How RUM Fits Your Monitoring Stack:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// RUM collection happens passively using browser APIs&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PerformanceObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEntries&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Send real user metrics to your monitoring platform&lt;/span&gt;
    &lt;span class="nf"&gt;sendToMonitoring&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entryType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;connectionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;effectiveType&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;buffered&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;long-animation-frame&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;buffered&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use a tool that figures all this out for you, like &lt;a href="https://requestmetrics.com/" rel="noopener noreferrer"&gt;Request Metrics&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What RUM Reveals That Synthetic Testing Misses:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;⚡ &lt;strong&gt;Production Load Reality&lt;/strong&gt; - How your application performs under actual traffic patterns, database load, and infrastructure stress&lt;/p&gt;

&lt;p&gt;🌍 &lt;strong&gt;Geographic Performance Variations&lt;/strong&gt; - CDN effectiveness, edge performance, and regional infrastructure issues that affect different user segments&lt;/p&gt;

&lt;p&gt;📱 &lt;strong&gt;Device &amp;amp; Network Diversity&lt;/strong&gt; - Real device performance from your actual user base, not simulated conditions&lt;/p&gt;

&lt;p&gt;🔄 &lt;strong&gt;Progressive Degradation&lt;/strong&gt; - Performance issues that develop over time or during specific traffic patterns&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing RUM in Your DevOps Workflow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Integration with Existing Monitoring:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most RUM tools can export metrics to DataDog, New Relic, or your existing observability platform&lt;/li&gt;
&lt;li&gt;Set up alerts based on Core Web Vitals thresholds and business impact metrics&lt;/li&gt;
&lt;li&gt;Correlate frontend performance with backend APM data for full-stack visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure Considerations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RUM agents typically add &amp;lt;10KB to your bundle size&lt;/li&gt;
&lt;li&gt;Use CSP policies to ensure secure data collection&lt;/li&gt;
&lt;li&gt;Consider GDPR compliance for user data collection in your deployment regions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Complete Monitoring Strategy
&lt;/h2&gt;

&lt;p&gt;Don't abandon synthetic testing—use both approaches strategically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development &amp;amp; CI/CD:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Synthetic tests in your pipeline to catch regressions before deployment&lt;/li&gt;
&lt;li&gt;Performance budgets as part of your deployment gates&lt;/li&gt;
&lt;li&gt;Consistent baseline measurements for A/B testing infrastructure changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Monitoring:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RUM for continuous real-user performance monitoring&lt;/li&gt;
&lt;li&gt;Business impact correlation and SLA tracking&lt;/li&gt;
&lt;li&gt;Geographic and device segment analysis for capacity planning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Incident Response:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RUM identifies performance issues affecting real users&lt;/li&gt;
&lt;li&gt;Synthetic tests help reproduce and debug specific problems&lt;/li&gt;
&lt;li&gt;Combined data provides complete picture for post-incident reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tool Selection for Operations Teams
&lt;/h2&gt;

&lt;p&gt;When evaluating RUM solutions, consider:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Integration capabilities&lt;/strong&gt; with your existing monitoring stack&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Real-time alerting&lt;/strong&gt; that integrates with PagerDuty/OpsGenie&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Geographic data collection&lt;/strong&gt; for multi-region deployments&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Custom metrics&lt;/strong&gt; for business-specific performance indicators&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Privacy compliance&lt;/strong&gt; features for global deployments  &lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start small:&lt;/strong&gt; Implement RUM on your most critical user flows first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baseline performance:&lt;/strong&gt; Establish current real-user performance metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set meaningful alerts:&lt;/strong&gt; Focus on business impact, not just threshold crossings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate and expand:&lt;/strong&gt; Add more pages and metrics based on initial insights&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The biggest surprise most teams discover? Performance issues they never knew existed, often affecting their most valuable user segments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;For a comprehensive deep-dive into RUM implementation, business impact analysis, and tool selection criteria, check out this detailed guide: &lt;a href="https://requestmetrics.com/web-performance/you-need-rum-to-understand-web-perf/" rel="noopener noreferrer"&gt;Why You Need Real User Monitoring to Really Understand Your Web Performance&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Discussion Questions for the Community:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🤔 How do you currently monitor web performance in your production environments?&lt;/p&gt;

&lt;p&gt;🚀 Have you found gaps between your synthetic test results and actual user complaints?&lt;/p&gt;

&lt;p&gt;⚙️ What's your experience integrating frontend performance monitoring with your existing observability stack?&lt;/p&gt;

&lt;p&gt;Drop your war stories and tool recommendations in the comments! 👇&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>performance</category>
      <category>devops</category>
      <category>o11y</category>
    </item>
    <item>
      <title>HTTP Caching for DevOps: Supercharge Site Performance Without Code Changes</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Fri, 28 Feb 2025 17:06:02 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/http-caching-for-devops-supercharge-site-performance-without-code-changes-1o8g</link>
      <guid>https://community.ops.io/requestmetrics/http-caching-for-devops-supercharge-site-performance-without-code-changes-1o8g</guid>
      <description>&lt;p&gt;Let's face it: developers get the glory for performance wins, but often it's us ops folks configuring the servers who can make the biggest impact. HTTP caching is the perfect example - a few server configuration tweaks can dramatically reduce load and improve user experience without touching application code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server-Side Caching Configuration 🚀
&lt;/h2&gt;

&lt;p&gt;Different web servers have different syntax, but the goal is the same: properly configured HTTP headers. Here are the magic incantations for common servers:&lt;/p&gt;

&lt;h3&gt;
  
  
  Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Inside server or location block&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(jpg|jpeg|png|gif|ico|css|js)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;1y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;"public,&lt;/span&gt; &lt;span class="s"&gt;max-age=31536000,&lt;/span&gt; &lt;span class="s"&gt;immutable"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# For HTML with validation&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.html&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;"public,&lt;/span&gt; &lt;span class="s"&gt;max-age=300,&lt;/span&gt; &lt;span class="s"&gt;must-revalidate"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "\.(jpg|jpeg|png|gif|ico|css|js)$"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Cache-Control "public, max-age=31536000, immutable"
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "\.html$"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Cache-Control "public, max-age=300, must-revalidate"
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Monitoring Cache Effectiveness
&lt;/h2&gt;

&lt;p&gt;How do you know if your caching strategy is working? Look at these metrics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cache Hit Ratio&lt;/strong&gt;: Percentage of requests served from cache vs origin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bandwidth Savings&lt;/strong&gt;: Reduced egress traffic from your servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server Load Reduction&lt;/strong&gt;: Fewer requests hitting your application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pro tip: Set up a dashboard tracking HTTP status codes - you want to see lots of 304s!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cache Validation: The DevOps Secret Weapon
&lt;/h2&gt;

&lt;p&gt;Smart validation configuration can reduce server load dramatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;# Enable ETags in Nginx
etag on;

# Apache ETags (already enabled by default)
FileETag MTime Size
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Proper ETag configuration means your server can respond with lightweight 304 responses instead of full payloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  CDN Integration Strategy
&lt;/h2&gt;

&lt;p&gt;Your CDN's cache behavior must align with your origin headers. For Cloudflare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;# Cache Everything rule with Edge TTL:
cache_everything: true
edge_cache_ttl: 2592000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This two-tier caching approach (browser + CDN) creates a performance multiplier effect!&lt;/p&gt;

&lt;p&gt;For more details on HTTP caching implementation patterns, check out my &lt;a href="https://requestmetrics.com/web-performance/http-caching/" rel="noopener noreferrer"&gt;comprehensive HTTP caching guide&lt;/a&gt; covering both developer and operational aspects.&lt;/p&gt;

&lt;p&gt;What server-side caching optimizations have you implemented? I'd love to hear your experiences!&lt;/p&gt;

</description>
      <category>performance</category>
      <category>http</category>
      <category>caching</category>
      <category>nginx</category>
    </item>
    <item>
      <title>GTMetrix Alternatives: Why You Need More Than Just Synthetic Testing</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Thu, 27 Feb 2025 15:56:31 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/gtmetrix-alternatives-why-you-need-more-than-just-synthetic-testing-58o7</link>
      <guid>https://community.ops.io/requestmetrics/gtmetrix-alternatives-why-you-need-more-than-just-synthetic-testing-58o7</guid>
      <description>&lt;p&gt;GTMetrix has been a go-to tool for website performance testing for years. It runs a synthetic test, gives you a score, and tells you whether your site is fast or slow. Simple, right?  &lt;/p&gt;

&lt;p&gt;Except &lt;strong&gt;synthetic tests don’t reflect real-world performance&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;GTMetrix runs tests in &lt;strong&gt;ideal conditions&lt;/strong&gt;—clean network, no background tasks, no real user interactions. But real visitors:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load your site &lt;strong&gt;on unreliable mobile networks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Get hit with &lt;strong&gt;third-party scripts slowing things down&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Experience &lt;strong&gt;delayed interactions and layout shifts&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If GTMetrix tells you your site is fast, but your real users still struggle, &lt;strong&gt;you need better insights than synthetic tests alone can provide&lt;/strong&gt;.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Synthetic Testing Isn’t Enough
&lt;/h2&gt;

&lt;p&gt;Synthetic tests generate &lt;strong&gt;lab-based results&lt;/strong&gt;, which are great for debugging but fail to capture &lt;strong&gt;real-world bottlenecks&lt;/strong&gt;. A perfect synthetic score means nothing if your actual users are waiting for elements to load or watching buttons shift just as they try to click them.  &lt;/p&gt;

&lt;p&gt;The better approach? &lt;strong&gt;Synthetic Testing + Real User Monitoring (RUM) + Google’s Chrome UX Report (CrUX)&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Synthetic Testing&lt;/strong&gt; runs performance tests in a &lt;strong&gt;controlled environment&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real User Monitoring (RUM)&lt;/strong&gt; collects performance data from &lt;strong&gt;actual visitors&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrUX&lt;/strong&gt; pulls &lt;strong&gt;real-world Core Web Vitals&lt;/strong&gt; from Chrome users.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best GTMetrix Alternatives Right Now
&lt;/h2&gt;

&lt;p&gt;If you’re running a mid-sized website with &lt;strong&gt;500,000 page views per month&lt;/strong&gt;, here’s how GTMetrix competitors compare:  &lt;/p&gt;

&lt;h3&gt;
  
  
  1. PageSpeed Insights (Free &amp;amp; Simple)
&lt;/h3&gt;

&lt;p&gt;💰  &lt;strong&gt;Free&lt;/strong&gt; and backed by Google  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;strong&gt;real Chrome UX Report (CrUX) data&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No real-time monitoring
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. WebPageTest (Advanced &amp;amp; Free)
&lt;/h3&gt;

&lt;p&gt;💰 Free with &lt;strong&gt;detailed synthetic test options&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports &lt;strong&gt;network throttling, waterfall charts, and filmstrip views&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No real user monitoring
&lt;/li&gt;
&lt;li&gt;Slow to run tests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Request Metrics (Synthetic + RUM in One Dashboard)
&lt;/h3&gt;

&lt;p&gt;💰 &lt;strong&gt;$88/month for full monitoring&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://requestmetrics.com/" rel="noopener noreferrer"&gt;Learn more about Request Metrics&lt;/a&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Combines Synthetic Testing + Real User Monitoring (RUM) + CrUX&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracks real Core Web Vitals from actual visitors&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automates synthetic tests on your busiest pages&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Pingdom (Integrated Uptime)
&lt;/h3&gt;

&lt;p&gt;💰 $130/mo - Uptime &amp;amp; Basic RUM&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uptime monitoring + RUM
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited synthetic testing flexibility&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Speedcurve (Advanced custom reporting)
&lt;/h3&gt;

&lt;p&gt;💰 $143/mo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Combines synthetic + real user monitoring&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highly customizable dashboards and reporting&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steep learning curve—complex reports can be difficult to configure&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SpeedCurve offers deep performance insights, but &lt;strong&gt;the custom reporting system is difficult to interpret&lt;/strong&gt;. If you need quick, actionable data, other tools may be easier to work with.  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;GTMetrix was great when it was free, but &lt;strong&gt;paying for one-off synthetic tests doesn’t make sense anymore&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you need &lt;strong&gt;quick lab tests&lt;/strong&gt;, use &lt;strong&gt;PageSpeed Insights&lt;/strong&gt; or &lt;strong&gt;WebPageTest&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;If you want to &lt;strong&gt;track real-world performance&lt;/strong&gt;, go with &lt;strong&gt;Request Metrics&lt;/strong&gt; ($88/mo).
&lt;/li&gt;
&lt;li&gt;If you need &lt;strong&gt;uptime alerts &amp;amp; monitoring&lt;/strong&gt;, &lt;strong&gt;Pingdom&lt;/strong&gt; is an option.
&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;deep custom reporting&lt;/strong&gt;, &lt;strong&gt;SpeedCurve&lt;/strong&gt; delivers—but expect a &lt;strong&gt;learning curve&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;strong&gt;Read the full breakdown here:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://requestmetrics.com/web-performance/gtmetrix-alternatives/" rel="noopener noreferrer"&gt;GTMetrix Alternatives: The Best Tools for Website Performance&lt;/a&gt;  &lt;/p&gt;

</description>
      <category>webperformance</category>
      <category>monitoring</category>
      <category>devops</category>
      <category>synthetic</category>
    </item>
    <item>
      <title>Website Image Optimization: Speed Up Your Site with Better Image Handling</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Wed, 05 Feb 2025 17:45:05 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/website-image-optimization-speed-up-your-site-with-better-image-handling-1381</link>
      <guid>https://community.ops.io/requestmetrics/website-image-optimization-speed-up-your-site-with-better-image-handling-1381</guid>
      <description>&lt;p&gt;Images make websites engaging, but they’re also one of the biggest performance killers. Large, unoptimized images &lt;strong&gt;slow down page loads, hurt SEO, and wreck Core Web Vitals&lt;/strong&gt;. If your site feels sluggish, image bloat is probably to blame.  &lt;/p&gt;

&lt;p&gt;Optimizing images &lt;strong&gt;can dramatically improve load times&lt;/strong&gt; while keeping your website visually sharp. Here’s a quick breakdown of &lt;strong&gt;how to make images load faster&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;For a full deep dive, check out the complete guide:&lt;br&gt;&lt;br&gt;
➡ &lt;a href="https://requestmetrics.com/web-performance/high-performance-images/" rel="noopener noreferrer"&gt;How to Optimize Website Images&lt;/a&gt;  &lt;/p&gt;


&lt;h2&gt;
  
  
  📸 Use the Right Image Format
&lt;/h2&gt;

&lt;p&gt;Not all image formats are efficient:  &lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;JPG (JPEG)&lt;/strong&gt; – Best for photos, small size with lossy compression.&lt;br&gt;&lt;br&gt;
✔ &lt;strong&gt;PNG&lt;/strong&gt; – Best for graphics &amp;amp; transparency but large files.&lt;br&gt;&lt;br&gt;
✔ &lt;strong&gt;WebP&lt;/strong&gt; – Smaller than JPG/PNG, great for most images.&lt;br&gt;&lt;br&gt;
✔ &lt;strong&gt;AVIF&lt;/strong&gt; – Best compression, but not universally supported yet.  &lt;/p&gt;

&lt;p&gt;Use a &lt;strong&gt;CDN&lt;/strong&gt; to &lt;strong&gt;automatically serve WebP/AVIF&lt;/strong&gt; when supported.  &lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ Compress and Optimize
&lt;/h2&gt;

&lt;p&gt;Uncompressed images &lt;strong&gt;waste bandwidth&lt;/strong&gt;. Shrink files using:  &lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;TinyPNG, ImageMin, or Squoosh&lt;/strong&gt; for lossy compression.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Strip metadata&lt;/strong&gt; (EXIF, camera details) to remove extra bloat.  &lt;/p&gt;

&lt;p&gt;Even &lt;strong&gt;minor compression&lt;/strong&gt; can cut image size by 50% or more.  &lt;/p&gt;


&lt;h2&gt;
  
  
  ⏳ Lazy-Load Below-the-Fold Images
&lt;/h2&gt;

&lt;p&gt;Prevent unnecessary downloads using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Optimized Image"&lt;/span&gt; &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;strong&gt;improves Largest Contentful Paint (LCP)&lt;/strong&gt; by focusing resources on critical images.  &lt;/p&gt;




&lt;h2&gt;
  
  
  📱 Serve Responsive Images
&lt;/h2&gt;

&lt;p&gt;Don’t make mobile users load huge desktop images. Use &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; 
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"image-700.jpg 700w, image-1200.jpg 1200w"&lt;/span&gt; 
    &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 1200px) 100vw, 1200px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image-1200.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Optimized image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;strong&gt;delivers the right size image&lt;/strong&gt; for every screen.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Cache and Deliver Images Efficiently
&lt;/h2&gt;

&lt;p&gt;✔ &lt;strong&gt;Use a CDN&lt;/strong&gt; – Faster global delivery.&lt;br&gt;&lt;br&gt;
✔ &lt;strong&gt;Enable HTTP/2 or HTTP/3&lt;/strong&gt; – Loads images in parallel.&lt;br&gt;&lt;br&gt;
✔ &lt;strong&gt;Set caching headers&lt;/strong&gt; – Prevents unnecessary re-downloads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache-Control: public, max-age=31536000, immutable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Optimizing images is an &lt;strong&gt;easy win for site speed and SEO&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use efficient formats (WebP, AVIF)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compress and lazy-load images&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serve responsive images for mobile&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host images with CDNs &amp;amp; caching&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For &lt;strong&gt;detailed steps&lt;/strong&gt;, check out the full guide:&lt;br&gt;&lt;br&gt;
➡ &lt;a href="https://requestmetrics.com/web-performance/high-performance-images/" rel="noopener noreferrer"&gt;How to Optimize Website Images&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webperformance</category>
      <category>performance</category>
      <category>images</category>
      <category>corewebvitals</category>
    </item>
    <item>
      <title>How to Fix Long Animation Frames (LoAFs) and Speed Up Your Website</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 21 Oct 2024 17:50:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/how-to-fix-long-animation-frames-loafs-and-speed-up-your-website-23jc</link>
      <guid>https://community.ops.io/requestmetrics/how-to-fix-long-animation-frames-loafs-and-speed-up-your-website-23jc</guid>
      <description>&lt;p&gt;If your website feels sluggish or unresponsive during animations, you’re likely dealing with &lt;strong&gt;Long Animation Frames (LoAFs)&lt;/strong&gt;. LoAFs occur when a single animation frame takes longer than 50 milliseconds to render, causing stuttering, lag, or what developers often call “jank.”&lt;/p&gt;

&lt;p&gt;The problem is, LoAFs aren’t immediately visible in Chrome DevTools by default. However, you can use the &lt;strong&gt;PerformanceObserver API&lt;/strong&gt; to track and analyze them in real time, helping you identify what’s slowing down your animations.&lt;/p&gt;

&lt;p&gt;One of the primary causes of LoAFs is &lt;strong&gt;heavy JavaScript execution&lt;/strong&gt;. Long-running scripts block the main thread and prevent the browser from rendering frames efficiently. To resolve this, break up long tasks into smaller chunks and spread them across multiple frames using setTimeout or other techniques to give the browser time to process animations smoothly.&lt;/p&gt;

&lt;p&gt;Another common culprit is &lt;strong&gt;forced synchronous layouts&lt;/strong&gt;, which happen when you modify the DOM and immediately read layout properties like offsetWidth or scrollHeight. To avoid this, batch your DOM reads and writes to minimize layout recalculations, or use transform for animations to avoid triggering expensive reflows.&lt;/p&gt;

&lt;p&gt;For modern web apps like &lt;strong&gt;Single Page Applications (SPAs)&lt;/strong&gt;, optimizing component re-renders and deferring non-essential JavaScript using code-splitting can also help reduce LoAFs and improve the user experience.&lt;/p&gt;

&lt;p&gt;For a more detailed breakdown of how to diagnose and fix Long Animation Frames, check out the full post on &lt;a href="https://requestmetrics.com/web-performance/long-animation-frame-loaf/" rel="noopener noreferrer"&gt;LoAFs and how to optimize them here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>webdev</category>
      <category>sre</category>
      <category>webperfops</category>
    </item>
    <item>
      <title>Our Super Friendly AI Sloth that Analyzes Your Observability Data</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 15 May 2023 00:00:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/our-super-friendly-ai-sloth-that-analyzes-your-observability-data-5c46</link>
      <guid>https://community.ops.io/requestmetrics/our-super-friendly-ai-sloth-that-analyzes-your-observability-data-5c46</guid>
      <description>&lt;p&gt;Seems like everyone is building a ChatGPT thing right now, doesn’t it? Well we are too! Inspired by so many others, we decided to see what AI could do with our simplified analytics and observability data.&lt;/p&gt;

&lt;p&gt;Turns out, it can do quite a lot.&lt;/p&gt;

&lt;p&gt;I’m thrilled to share that &lt;a href="https://requestmetrics.com/feature/ai-analysis/" rel="noopener noreferrer"&gt;we’ve shipped our first AI insights chatbot, Professor Sloth&lt;/a&gt;. With this ChatGPT-powered AI Assistant, Request Metrics is taking data analysis to the next level by helping you spot anomalies, suggesting courses of action, and guiding you towards valuable insights.&lt;/p&gt;

&lt;p&gt;But this wasn’t without it’s challenges…&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt Engineering Challenges
&lt;/h2&gt;

&lt;p&gt;Integrating OpenAI’s ChatGPT into Request Metrics proved to be an interesting challenge, particularly when it came to the emerging problem of &lt;em&gt;prompt engineering&lt;/em&gt;. To get &lt;em&gt;correct&lt;/em&gt; and interesting results, we had to talk to this supremely powerful AI like it was a first-grade math student. Phrases like &lt;em&gt;“go slow”&lt;/em&gt;, &lt;em&gt;“check your work”&lt;/em&gt;, and &lt;em&gt;“let’s take this step by step”&lt;/em&gt; litter our prompts.&lt;/p&gt;

&lt;p&gt;Without these statements, we found that ChatGPT would often outright lie to us, reporting median values that weren’t in the dataset, or reporting trends that were not statistically relevant. Much like guiding a young learner, it was essential to provide clear instructions and set expectations to ensure that ChatGPT could understand and analyze the data effectively.&lt;/p&gt;

&lt;p&gt;With a little care and patience, this approach allowed us to harness the power of AI while maintaining a high level of accuracy and relevance in the insights generated by Professor Sloth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Professor Sloth and Data Analysis
&lt;/h2&gt;

&lt;p&gt;Incorporating an AI Assistant like Professor Sloth into your data analysis workflow offers numerous advantages. Here are some benefits we’ve observed while using Professor Sloth:&lt;/p&gt;

&lt;h3&gt;
  
  
  Anomaly Detection
&lt;/h3&gt;

&lt;p&gt;Professor Sloth can quickly spot anomalies in your data, helping you identify potential issues and areas for improvement. This can save you time and effort by automating the initial data exploration process. Here’s an example where the professor found an &lt;a href="https://requestmetrics.com/feature/api-monitoring/" rel="noopener noreferrer"&gt;API Endpoint anomaly&lt;/a&gt;, and pointed out that they are all SVG file requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/c0N5Cej9FTCsu2oZ1zqT_NiMreR7YsixwsRjqCH8ykM/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3lxNHFv/ZmVuYzlkOXNjNDJl/NnU1LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/c0N5Cej9FTCsu2oZ1zqT_NiMreR7YsixwsRjqCH8ykM/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3lxNHFv/ZmVuYzlkOXNjNDJl/NnU1LnBuZw" alt="Professor Sloth identifying an API Anomaly" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Actionable Recommendations
&lt;/h3&gt;

&lt;p&gt;Our ChatGPT-powered AI Sloth suggests courses of action based on the data it analyzes. This helps you make informed decisions on where to invest your resources and how to improve your website’s performance. Here’s an example where it found the largest &lt;a href="https://requestmetrics.com/feature/web-analytics/" rel="noopener noreferrer"&gt;web analytics sources of traffic&lt;/a&gt;, and recommended additional focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/nobikWADS-8tuwPaFMSBqY3xUb_fTbQNDvFN1Mu8KNk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2oyc244/dTB3NTBkdjNjODVh/Mjl3LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/nobikWADS-8tuwPaFMSBqY3xUb_fTbQNDvFN1Mu8KNk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2oyc244/dTB3NTBkdjNjODVh/Mjl3LnBuZw" alt="Professor Sloth Recommending Analytics Focus" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Guided Analysis
&lt;/h3&gt;

&lt;p&gt;Professor Sloth recommends additional data analysis steps to help you dive deeper into specific areas of interest. This can be particularly useful when you’re unsure where to start or need help identifying new avenues for exploration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/6AeygAzV7HzKWAUEBj7VbZkh3XhhF0bRzKlChGBe6mo/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3NvanU1/dmoxZmxrd2ZyNDR6/eHo2LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/6AeygAzV7HzKWAUEBj7VbZkh3XhhF0bRzKlChGBe6mo/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3NvanU1/dmoxZmxrd2ZyNDR6/eHo2LnBuZw" alt="Professor Sloth Recommending Geographic Filters" width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, Professor Sloth suggested some geographic filters to get more relevant data, focusing on US and German traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ongoing Training for Professor Sloth
&lt;/h2&gt;

&lt;p&gt;Currently, Professor Sloth is available in a handful of locations throughout the Request Metrics UI. However, we have big plans for our AI Assistant. In the coming weeks, we’ll be expanding its presence within the platform and teaching it about more types of data.&lt;/p&gt;

&lt;p&gt;As the AI APIs continue to evolve, we hope to expand Professor Sloth’s chat capabilities, allowing you to ask further questions about your data and receive even more personalized insights. With this ChatGPT-powered feature, we aim to make data analysis more accessible, efficient, and enjoyable for all users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Professor Sloth shows off the power and potential of AI integration in data analysis. By overcoming the challenges of prompt engineering and leveraging the capabilities of OpenAI’s ChatGPT, we’ve created a valuable tool that can revolutionize the way you approach your website’s data.&lt;/p&gt;

&lt;p&gt;With Professor Sloth, you’ll gain access to anomaly detection, actionable recommendations, and guided analysis, all powered by cutting-edge AI technology. As we continue to expand and evolve this feature, we’re confident that Professor Sloth will become an indispensable asset in your quest for data-driven insights and website optimization.&lt;/p&gt;

&lt;p&gt;Ready to try it out? Check out our &lt;a href="https://app.requestmetrics.com/demo" rel="noopener noreferrer"&gt;live sandbox&lt;/a&gt; and see what Professor Sloth has to say about the data. Or &lt;a href="https://app.requestmetrics.com/signup" rel="noopener noreferrer"&gt;sign-up for Request Metrics free&lt;/a&gt; and get AI-powered insights on your own analytics and observability data!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>o11y</category>
      <category>devops</category>
    </item>
    <item>
      <title>Expanding Our Vision: Unifying Client-Side Observability Data</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Thu, 11 May 2023 00:00:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/expanding-our-vision-unifying-client-side-observability-data-42i8</link>
      <guid>https://community.ops.io/requestmetrics/expanding-our-vision-unifying-client-side-observability-data-42i8</guid>
      <description>&lt;p&gt;In 2021, we started Request Metrics as a simple and developer-friendly service to measure and &lt;a href="https://requestmetrics.com/web-performance/measure-web-performance" rel="noopener noreferrer"&gt;improve web performance&lt;/a&gt;. We built an incredible platform that distilled complex data down into simple reports and recommendations. Lots of teams around the world found valuable insights in Request Metrics that they couldn’t get anywhere else.&lt;/p&gt;

&lt;p&gt;But web performance data can be very unpredictable—the web slows down in all sorts of ways. When one of our customer’s pages slowed down, or their &lt;a href="https://requestmetrics.com/core-web-vitals/" rel="noopener noreferrer"&gt;Core Web Vitals&lt;/a&gt; slipped, we ran into 2 big limitations:&lt;/p&gt;

&lt;p&gt;First, does this delay matter to my user? Did it cost me a sale? Do I need to fix it right now? We couldn’t answer these questions because we didn’t have enough context about what the user was trying to do.&lt;/p&gt;

&lt;p&gt;Second, what is causing this thing to be slow? We can’t always recreate the problem in our local environments, and we didn’t have deep enough data to debug individual sessions.&lt;/p&gt;

&lt;p&gt;To address these problems, we needed to think &lt;em&gt;bigger&lt;/em&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  A Challenge Beyond Web Performance
&lt;/h2&gt;

&lt;p&gt;The limitations we faced aren’t limited to web performance. When there’s a JavaScript error, how do we know if it has user impact? When an API is failing, does it halt the checkout flow? When a user is interacting, which components do they depend on?&lt;/p&gt;

&lt;p&gt;Today, this data is scattered across various kinds of tools, such as product analytics, error reporting, API observability, performance, and security monitoring. There is so much power to be unlocked by bringing this data together, and that’s exactly what Request Metrics is going to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Client-Side Observability Platform
&lt;/h2&gt;

&lt;p&gt;Our goal for Request Metrics is to bring these disparate pools of data together—to unify client-side data and reveal the correlations between user intent, product analytics, and system monitoring.&lt;/p&gt;

&lt;p&gt;Imagine getting an alert with this context:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;3 API endpoints are returning higher 500 responses than normal, and form submissions for impacted sessions are down by 75%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are going to combine operational problems with user impact so that we can focus on the problems that really impact our users, and cut out the noisy background radiation of the web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accelerating and Expanding Observability
&lt;/h2&gt;

&lt;p&gt;Many monitoring products need to understand your entire infrastructure—every service, database, and backend resource you depend on. To get that, you have to deploy agents, make code changes, or use specific platforms. It’s a huge upfront cost and many small teams can’t justify it. We’re approaching the problem differently.&lt;/p&gt;

&lt;p&gt;What if we approached observability from what the &lt;em&gt;real users&lt;/em&gt; see, instead of our infrastructure? And what if we made the setup so easy that any engineer could do it in 1 minute. What if you could copy-paste a single bit of JavaScript into your page and get visibility into everything the user touches? That’s what we’re building: turnkey analytics and observability from the client-side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security and Privacy in Analytics
&lt;/h2&gt;

&lt;p&gt;Many security-focused organizations are unable to use cloud services for potentially sensitive data, and have been left behind by modern analytics and monitoring vendors.&lt;/p&gt;

&lt;p&gt;That’s why we’re making Request Metrics ready to be installed on-premise, or in your private cloud. A single install, package, and vendor to manage that can give you monitoring visibility across your teams.&lt;/p&gt;

&lt;p&gt;Oh, and because we don’t drop a cookie or track anything identifiable about the end user (dropping IP and user agent on ingest), we’re fully GDPR compliant and ready to use anywhere you need visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road Ahead
&lt;/h2&gt;

&lt;p&gt;We have an ambitious vision, and we’re diligently working to make it a reality over the remainder of this year. Today we’ve already shipped Session Analytics, with the ability to dive into a full session timeline for users. We’re expanding our performance tools into full &lt;a href="https://requestmetrics.com/feature/user-experience-monitoring/" rel="noopener noreferrer"&gt;User Experience monitoring&lt;/a&gt;, allowing you to dig all the way into individual load timings and waterfalls. As well as &lt;a href="https://requestmetrics.com/feature/api-monitoring/" rel="noopener noreferrer"&gt;API observability&lt;/a&gt;, tracking the traffic, responses, and performance of your first party and third-party API calls.&lt;/p&gt;

&lt;p&gt;Soon, you’ll see security and website integrity reports added, so we can tell you when naughty JavaScript sneaks into your code or tries to steal data from your users. We’ll also be bringing a JavaScript error reporting component, and expanding analytics to include custom events and user journeys. There is so much great stuff coming!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Request Metrics is a new kind of dev tool: focused on the &lt;em&gt;user experience&lt;/em&gt; of your site, doing more of the thinking for you, and exposing when weird things happen in your system. You shouldn’t have to feed your dev tools queries, it should just give you answers. We’re excited to make it happen and help you make better, faster software. Sign up for a &lt;a href="https://app.requestmetrics.com/signup" rel="noopener noreferrer"&gt;free trial of Client-Side Observability&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>performance</category>
      <category>devops</category>
      <category>o11y</category>
    </item>
    <item>
      <title>Explaining Performance to Non-Technical Stakeholders</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Tue, 13 Sep 2022 08:00:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/explaining-performance-to-non-technical-stakeholders-3mdp</link>
      <guid>https://community.ops.io/requestmetrics/explaining-performance-to-non-technical-stakeholders-3mdp</guid>
      <description>&lt;p&gt;Whether you’re an e-commerce company, a SaaS provider, or a content publisher, understanding the performance of your website is important to &lt;em&gt;everyone&lt;/em&gt; on the team—not just the developers. Performance is a huge part of the user experience and directly tied to how well your website achieves its goals. But web performance is often measured in very technical terms, like &lt;a href="https://requestmetrics.com/web-performance/largest-contentful-paint" rel="noopener noreferrer"&gt;Largest Contentful Paint&lt;/a&gt;, that cause most business folk’s eyes to glaze over.&lt;/p&gt;

&lt;p&gt;This language gap is a big part of the reason why many websites are so slow. Many only consider performance from their own perspective—“it’s fast for me”—and leave it at that. We simply lack the vocabulary to talk about the problem.&lt;/p&gt;

&lt;p&gt;To effectively talk about web performance with everyone on the team, you have to break through the jargon and talk about what really matters: the experience of the real users and how that impacts the business. Here’s a few ways to do that:&lt;/p&gt;

&lt;h2&gt;
  
  
  Push what’s Important
&lt;/h2&gt;

&lt;p&gt;Performance is rarely top of mind, and it’s unlikely anyone will go looking for it unless a user is complaining. Most users don’t complain—they just leave.&lt;/p&gt;

&lt;p&gt;To keep your users, you need to know about performance before it gets bad. You need to know when it’s important.&lt;/p&gt;

&lt;p&gt;At Request Metrics, its our job to figure out what’s important and push the relevant information to you. We examine all your web performance data and push a summary to your inbox with what you need to know.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/cz3h0YtRAGGxrZnF0vgVIy-FteENP7VGFgyhl5xJbc8/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzRwdHVx/M3FxMzcya3dlZXZm/NDU1LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/cz3h0YtRAGGxrZnF0vgVIy-FteENP7VGFgyhl5xJbc8/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzRwdHVx/M3FxMzcya3dlZXZm/NDU1LnBuZw" alt="User Experience Report" width="800" height="1136"&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="https://requestmetrics.com/assets/images/webperf/explaining-performance/Desktop_UX_Report.pdf" rel="noopener noreferrer"&gt;Download the full report PDF.&lt;/a&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;And to make it sharable, we publish it as a PDF so that you can forward it on to your client, your boss, or the executives in charge.&lt;/p&gt;

&lt;h2&gt;
  
  
  BLUF: Bottom Line Up Front
&lt;/h2&gt;

&lt;p&gt;This old military acronym is about getting right to the most important information first—lives could depend on it!&lt;/p&gt;

&lt;p&gt;Your situation is (probably) not that dire, but the advice stands. If the most interesting performance anomalies are buried three clicks deep, it’s unlikely to be discovered.&lt;/p&gt;

&lt;p&gt;At Request Metrics,we expose the interesting things in plain language at the top of all of our reports and dashboards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/rQU4wX8GSEfZ8R-zD76cv8QR7gMF0QQ5FZqIgK5bEro/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3IyNjVu/aW1nb3FvaG00NHg3/eGprLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/rQU4wX8GSEfZ8R-zD76cv8QR7gMF0QQ5FZqIgK5bEro/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3IyNjVu/aW1nb3FvaG00NHg3/eGprLnBuZw" alt="Plain language descriptions of performance in Request Metrics" width="758" height="876"&gt;&lt;/a&gt;&lt;br&gt;Plain language descriptions of performance in Request Metrics.
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;This takes the burden off the developer to interpret the data for their team. We can plainly state what’s happening, backed up with data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Describe Metrics as User Impact
&lt;/h2&gt;

&lt;p&gt;Web performance metrics are highly technical and confusing—even to developers. If you don’t understand what &lt;a href="https://requestmetrics.com/web-performance/cumulative-layout-shift/" rel="noopener noreferrer"&gt;Cumulative Layout Shift&lt;/a&gt; is measuring, its hard to care that the score isn’t good.&lt;/p&gt;

&lt;p&gt;Instead, start the conversation with the user impact of the metric, like “the website has a lot of frustrating shifting of content for 75% of our users”&lt;/p&gt;




&lt;p&gt;Performance can be a powerful way to make your websites better and more effective—but only if you know how to have the conversation. Remember to Push what’s important to your stakeholders, put the bottom line up front, and describe metrics in terms of user impact. If you have the real user data and reports from Request Metrics, that will help.&lt;/p&gt;

&lt;p&gt;Have a look at the &lt;a href="https://requestmetrics.com/assets/images/webperf/explaining-performance/Desktop_UX_Report.pdf" rel="noopener noreferrer"&gt;example performance report&lt;/a&gt; and see how it can help drive the performance conversation on your team.&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>data</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Audit Google Ad Performance With Lighthouse</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 01 Aug 2022 08:00:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/audit-google-ad-performance-with-lighthouse-2gio</link>
      <guid>https://community.ops.io/requestmetrics/audit-google-ad-performance-with-lighthouse-2gio</guid>
      <description>&lt;p&gt;Implementing Google Ads can be complicated.  If done incorrectly, it &lt;a href="https://requestmetrics.com/web-performance/google-ads-are-slow" rel="noopener noreferrer"&gt;negatively impacts your website's performance&lt;/a&gt;.  Fortunately, there is a new &lt;a href="https://github.com/googleads/publisher-ads-lighthouse-plugin" rel="noopener noreferrer"&gt;Google Lighthouse plugin&lt;/a&gt; tailored specifically to find problems with your Google ad implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Publisher Ads Plugin
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Publisher Ads Audits for Lighthouse&lt;/strong&gt; is a plugin created to help surface issues with your Google ads setup.  It's open source and &lt;a href="https://github.com/googleads/publisher-ads-lighthouse-plugin" rel="noopener noreferrer"&gt;hosted on Github&lt;/a&gt;.  It's currently developed specifically for users of &lt;strong&gt;Google Ad Manager&lt;/strong&gt; and uses a series of automated audits to spot problems.&lt;/p&gt;

&lt;h4&gt;
  
  
  Running the Plugin From Chrome
&lt;/h4&gt;

&lt;p&gt;To get started simply open the Chrome Developer tools and navigate to the Lighthouse tab.  You'll find a (beta) Community Plugin called &lt;strong&gt;Publisher Ads&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/8HIkqVJ5DQwOzIZiqEFwYgc3znG84kfGmFEeUW5pKgM/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3g3NTAx/NmFiaXB1YTZyN2Zz/cWxoLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/8HIkqVJ5DQwOzIZiqEFwYgc3znG84kfGmFEeUW5pKgM/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3g3NTAx/NmFiaXB1YTZyN2Zz/cWxoLnBuZw" alt="The Publisher Ads Audit" width="684" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can be run like any other Lighthouse audit - either on its own or in combination with the other audits available.&lt;/p&gt;

&lt;h4&gt;
  
  
  Running the Plugin on the Web
&lt;/h4&gt;

&lt;p&gt;If you don't use Chrome, Google helpfully hosts a web page that can &lt;a href="https://developers.google.com/publisher-ads-audits/" rel="noopener noreferrer"&gt;run the Publisher Ads audits&lt;/a&gt; as well.  This is useful to get a second datapoint other than your own browser.  You can find it here: &lt;strong&gt;&lt;a href="https://developers.google.com/publisher-ads-audits/" rel="noopener noreferrer"&gt;https://developers.google.com/publisher-ads-audits/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Publisher Ads In Action
&lt;/h2&gt;

&lt;p&gt;When we &lt;a href="https://requestmetrics.com/web-performance/google-ads-are-slow" rel="noopener noreferrer"&gt;previously discussed Google ad performance impact&lt;/a&gt;, we looked at a few sites which saw a large slowdown when ads were enabled.  One of those was &lt;strong&gt;CNN.com&lt;/strong&gt;.  We decided to see what the plugin could tell us about the ad setup on their site.&lt;/p&gt;

&lt;h3&gt;
  
  
  CNN.com Audit Results
&lt;/h3&gt;

&lt;p&gt;Like most of the Lighthouse audits, the site is given an overall score, and then individual audit problems are surfaced below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/ZMJZFV7QN37D4h1J4ypO_wdmQcGLw-N7gKDZZayKMqs/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2hmdHEw/ZG42Nm5zdHA2eGNh/M2FjLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/ZMJZFV7QN37D4h1J4ypO_wdmQcGLw-N7gKDZZayKMqs/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2hmdHEw/ZG42Nm5zdHA2eGNh/M2FjLnBuZw" width="662" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Duplicate Tag Loads
&lt;/h4&gt;

&lt;p&gt;CNN is loading the exact same Google Publisher tag twice. This is needlessly wasteful of bandwidth and impacting load time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/ihiiQA2LA86jf89cTxA93XcVmgKicP4D64_HMpv9gxc/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3FncnZo/cm1tc2J0NmJud3Bt/YzFjLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/ihiiQA2LA86jf89cTxA93XcVmgKicP4D64_HMpv9gxc/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3FncnZo/cm1tc2J0NmJud3Bt/YzFjLnBuZw" width="666" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Parallel Bid Requests
&lt;/h4&gt;

&lt;p&gt;We also see that CNN is gathering bid requests in serial, and could potentially make both of those bid requests at the same time to speed things up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/eUmq2eYsaXmUiQRig_p2wOSUzjsOfspAW7sw9u3l6gM/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzY5amg5/Nm16Mno5MW9wcDhv/dmsxLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/eUmq2eYsaXmUiQRig_p2wOSUzjsOfspAW7sw9u3l6gM/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzY5amg5/Nm16Mno5MW9wcDhv/dmsxLnBuZw" width="659" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Slow Requests Blocking Your Ads
&lt;/h4&gt;

&lt;p&gt;Ads aren't always slow because of ad providers alone.  Oftentimes other resources on your site will block the ad requests from doing their work.  The Publisher Ads plugin will also show you which resources are blocking your ads from completing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/FOjqToWMQvTJZSXASj2PRB9lKYTLFZOxKAmndghMOSg/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzAzNm1o/N2tjZXFjbzZpd3Ry/NWI2LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/FOjqToWMQvTJZSXASj2PRB9lKYTLFZOxKAmndghMOSg/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzAzNm1o/N2tjZXFjbzZpd3Ry/NWI2LnBuZw" width="662" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Many Helpful Suggestions
&lt;/h4&gt;

&lt;p&gt;Publisher Ads contains over 20 audits in related to Google ads and common implementation mistakes.  Not only will it show you which audits fail, but also which pass, and by how much.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/RUF325ymrQvpE4E5zPChUjpSTsfMpen4xfCTbci684Y/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL29lY2Nu/c3B0d24yZGJpZnBz/dThhLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/RUF325ymrQvpE4E5zPChUjpSTsfMpen4xfCTbci684Y/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL29lY2Nu/c3B0d24yZGJpZnBz/dThhLnBuZw" width="666" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Publisher Ads Lighthouse audit is a great way to get started with optimizing your Google ads implementation.  It suffers from the &lt;a href="https://requestmetrics.com/web-performance/synthetic-testing-and-real-user-monitoring#synthetic-testing" rel="noopener noreferrer"&gt;same issues all synthetic tests have&lt;/a&gt;, but it should certainly be a part of your ongoing Google ad performance monitoring.&lt;/p&gt;

&lt;p&gt;Another part of your strategy should be monitoring your site's performance with &lt;a href="https://app.requestmetrics.com/signup" rel="noopener noreferrer"&gt;Request Metrics&lt;/a&gt;.  We'll tell you whether your changes are having a meaningful impact on your actual users, and not just in Google Lighthouse.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>webperf</category>
      <category>devops</category>
      <category>o11y</category>
    </item>
    <item>
      <title>How To Read Flame Charts and Percentiles</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 25 Jul 2022 08:00:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/how-to-read-flame-charts-and-percentiles-45lc</link>
      <guid>https://community.ops.io/requestmetrics/how-to-read-flame-charts-and-percentiles-45lc</guid>
      <description>&lt;p&gt;Charting can be complicated and intimidating, especially when dealing with web performance data, flame charts, and percentiles. There is so much data crammed together! Why are the numbers all different?! Let’s break down these charts, what they are good for, and when to use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flame Charts
&lt;/h2&gt;

&lt;p&gt;A flame chart uses a stacked colored bar chart to show both the number of users and their performance for a given time. It is usually a &lt;em&gt;histogram&lt;/em&gt;, showing how the data changes over time. Here’s an example of a flame chart from a Request Metrics page load performance report.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/ZX8EaOktuyPk7v5TLgyyK9riVlbpz2sNNSTfaZ3rdwk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3ZzNmtw/bTltencwamlzeGQw/eTA1LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/ZX8EaOktuyPk7v5TLgyyK9riVlbpz2sNNSTfaZ3rdwk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3ZzNmtw/bTltencwamlzeGQw/eTA1LnBuZw" alt="Load Time Performance Flame Histogram Chart" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each bar (or flame) shows the total number of visits to the page. The relative size of each color shows the performance experienced by users. Cooler colors usually mean “faster” performance, while warmer colors are slower.&lt;/p&gt;

&lt;p&gt;Flame charts are useful to see big changes in your performance. For example, the flame chart below shows the last 90 days of load performance data for a page. The increasing size of the flames shows that the traffic is increasing each week. The flames are also getting warmer, with less blue and more red, telling us that the page is slowing down under the increased traffic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/vUrojjPRPDy-KguH4wRSQsnW4D4DYfKI9kN9URcJGkU/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL24xZzc3/eWx5a2ZhNnc2d2Q0/ODN1LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/vUrojjPRPDy-KguH4wRSQsnW4D4DYfKI9kN9URcJGkU/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL24xZzc3/eWx5a2ZhNnc2d2Q0/ODN1LnBuZw" alt="Slowing Trend in Load Time Performance Flame Chart" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Flame Charts Are Bad for Small Changes
&lt;/h3&gt;

&lt;p&gt;Flame charts are a great tool for showing big trends, but it can be hard to spot subtle changes in them. It’s difficult for most people to spot small changes in a color distribution. Take this flame chart for instance. There was a performance improvement made around June 20th. Can you spot it? I can’t.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/Er01Ar4aS1Ud7YrEOZWvGM_wKRgbxd794lFC6fJmsac/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2IzNTJy/bXVjdWRmMXE5YXln/ZjB5LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/Er01Ar4aS1Ud7YrEOZWvGM_wKRgbxd794lFC6fJmsac/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2IzNTJy/bXVjdWRmMXE5YXln/ZjB5LnBuZw" alt="Subtle Change in Load Time Performance Flame Chart" width="800" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where &lt;em&gt;percentiles&lt;/em&gt; become really useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Percentiles
&lt;/h2&gt;

&lt;p&gt;Hang on, we’re going to channel some of that 7th grade math class you slept through. Let’s say you’ve gathered a bunch of time-to-load performance data. If you sort that data from fastest to slowest, it might look like like the table below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Load Time&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.6s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.7s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Median&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.1s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.7s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75th percentile&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.1s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95th percentile&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The value that fits in the “middle” of the data, so that half of the data is faster and half is slower, is called the &lt;strong&gt;median&lt;/strong&gt; , or &lt;strong&gt;50th percentile&lt;/strong&gt;. This value is useful because it says, “half of my users had performance better than this”.&lt;/p&gt;

&lt;p&gt;The 75th percentile, or 75% of the data is faster, is very useful for web performance data because it shows you what &lt;em&gt;most&lt;/em&gt; users will see as the worst-case.&lt;/p&gt;

&lt;p&gt;The 95th percentile, where 95% of the data is faster, shows us what the slowest users experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not use the slowest data?
&lt;/h3&gt;

&lt;p&gt;A lot of crazy stuff happens on the web. The slowest data in most real-world reporting is usually unrealistically slow. It’s often bad data being reported from bots, bugs, or suspended pages: generally stuff you don’t care about. Using the 95th percentile trims off this bad data and gives you the slowest &lt;em&gt;realistic&lt;/em&gt; performance experience.&lt;/p&gt;

&lt;p&gt;Let’s look back at our “small change” example. If we chart the data as percentiles rather than a flame chart, we can see smaller patterns. In this example, load time performance gets a touch faster on June 20th.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/wqanzIsUOCLt58efyB2m71SWefRKovkrcBw6eV9AcoE/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2Jrenh1/ejlmNjJydHNxa2U1/cjFwLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/wqanzIsUOCLt58efyB2m71SWefRKovkrcBw6eV9AcoE/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2Jrenh1/ejlmNjJydHNxa2U1/cjFwLnBuZw" alt="Load Time Performance Percentiles" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This pattern is visible on all three charted percentiles, so the page got a touch faster for everyone. Nice work team.&lt;/p&gt;

&lt;h3&gt;
  
  
  The danger of averages
&lt;/h3&gt;

&lt;p&gt;When trying to interpret a pile of data, it is tempting to look at the averages, but this can be very misleading. Averages will smooth out interesting patterns and hide the true experiences of the fastest and slowest users.&lt;/p&gt;

&lt;p&gt;The average load time for the data is about 3.2 seconds, a time that doesn’t really reflect the fastest users, slowest users, or even the majority of users. Producing a few percentiles is much more informative.&lt;/p&gt;

&lt;p&gt;Check out more about the averages and performance statistics in &lt;a href="https://requestmetrics.com/web-performance/measure-web-performance#chapter-2-web-performance-metrics" rel="noopener noreferrer"&gt;chapter 2&lt;/a&gt; of the &lt;a href="https://requestmetrics.com/web-performance/measure-web-performance" rel="noopener noreferrer"&gt;Definitive Guide to Measuring Web Performance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Why gather the data and do the math yourself though? This is what Request Metrics is made for! Let us &lt;a href="https://requestmetrics.com/" rel="noopener noreferrer"&gt;report on your end user performance&lt;/a&gt; and give you exactly the reports you need to make your website fast. I bet you’ll love it.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>o11y</category>
      <category>performance</category>
    </item>
    <item>
      <title>Google Ads Are Slowing You Down</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 18 Jul 2022 08:00:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/google-ads-are-slowing-you-down-58af</link>
      <guid>https://community.ops.io/requestmetrics/google-ads-are-slowing-you-down-58af</guid>
      <description>&lt;p&gt;Google has a well earned &lt;a href="https://requestmetrics.com/web-performance/performance-profiling-google" rel="noopener noreferrer"&gt;reputation&lt;/a&gt; for speed. At least on their own sites. It’s an entirely different story when it comes to their ad network. Google ads are slowing down thousands of sites across the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Ads in Action
&lt;/h2&gt;

&lt;p&gt;Regardless of what you think of their content, CNN is one of the most popular sites on the internet - and they use Google Ads. There is a large Google-served banner advertisement at the top of the page. It often pops in seconds after the rest of the site has rendered. This ad dramatically slows page load and causes a large layout shift which irritates users and could &lt;a href="https://www.searchenginejournal.com/ranking-factors/core-web-vitals/" rel="noopener noreferrer"&gt;hurt their search rankings&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  CNN.com Banner Ad Example
&lt;/h3&gt;


        
    

&lt;h3&gt;
  
  
  Google Ads Are Everywhere
&lt;/h3&gt;

&lt;p&gt;It’s easy to pick on &lt;a href="https://cnn.com" rel="noopener noreferrer"&gt;cnn.com&lt;/a&gt;, but Google ads are ubiquitous. They’re served up everywhere, especially in the media industry, and they’re causing performance issues.&lt;/p&gt;

&lt;p&gt;For this post we’re going to focus on these major news sites: &lt;strong&gt;nytimes.com, cnn.com, foxnews.com, wsj.com, and espn.com&lt;/strong&gt;. Every one of them has at least one Google ad on the page.&lt;/p&gt;

&lt;p&gt;The goal is to find out what impact, if any, do Google ads have on their web performance?&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring the Performance Impact of Google Ads
&lt;/h2&gt;

&lt;p&gt;The best way to measure the performance impact of Google ads on a site like &lt;strong&gt;cnn.com&lt;/strong&gt; would be to run A/B tests with Google ads on and off, over a diverse cross section of users. But we don’t work for CNN and don’t control their ads (the site would be faster if we did) so we have to use the tools available to us.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Test Setup
&lt;/h3&gt;

&lt;p&gt;In order to A/B test the web performance of sites with and without Google ads, we’re going to use &lt;a href="https://developers.google.com/web/tools/puppeteer" rel="noopener noreferrer"&gt;Puppeteer&lt;/a&gt;. This is a tool from Google that allows us to automate Chrome with code.&lt;/p&gt;

&lt;p&gt;To attempt some level of fairness, each site will be loaded 10 times with Google ads enabled, and 10 times with Google ads blocked. The browser’s cache will be disabled, and we’ll alternate between loading with ads, and loading without, in an attempt to smooth over any network hiccups.&lt;/p&gt;

&lt;p&gt;Rather than blocking all ads on the page (some of these sites are using more than one provider), we’re &lt;a href="https://www.netify.ai/resources/applications/google-ads" rel="noopener noreferrer"&gt;only going to block those domains belonging to Google&lt;/a&gt;. Puppeteer allows us to &lt;a href="https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pagesetrequestinterceptionvalue" rel="noopener noreferrer"&gt;inspect every outgoing request&lt;/a&gt;, and block it as we see fit.&lt;/p&gt;

&lt;p&gt;The load times of each page will be pulled directly from the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API" rel="noopener noreferrer"&gt;window.performance&lt;/a&gt; API in the browser. We’ll also grab the &lt;a href="https://requestmetrics.com/web-performance/cumulative-layout-shift" rel="noopener noreferrer"&gt;Cumulative Layout Shift&lt;/a&gt; to see if Google ads are having a negative effect on The Core Web Vitals as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slow Going
&lt;/h3&gt;

&lt;p&gt;After gathering data from all the sites - with ads and without - the results were clear. Google ads had a negative impact on the performance of every site tested. In most cases a sizably negative impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Load Performance Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;No Ads&lt;/th&gt;
&lt;th&gt;With Ads&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;espn.com&lt;/td&gt;
&lt;td&gt;2.9s&lt;/td&gt;
&lt;td&gt;3.5s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.2x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;2.5s&lt;/td&gt;
&lt;td&gt;3.5s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.4x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cnn.com&lt;/td&gt;
&lt;td&gt;7.0s&lt;/td&gt;
&lt;td&gt;16.7s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.4x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;foxnews.com&lt;/td&gt;
&lt;td&gt;4.6s&lt;/td&gt;
&lt;td&gt;16.2s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.5x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wsj.com&lt;/td&gt;
&lt;td&gt;2.8s&lt;/td&gt;
&lt;td&gt;14.8s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.3x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Load Times With and Without Google Ads&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;ESPN had the lowest impact from Google ads - seeing only a &lt;strong&gt;20% increase&lt;/strong&gt; in load time when ads were enabled. On the other end of the spectrum, load times for the Wall Street Journal were a whopping &lt;strong&gt;5.3x slower&lt;/strong&gt; with ads vs. without.&lt;/p&gt;

&lt;p&gt;CNN escaped with a medium impact score, but only because they notched &lt;strong&gt;the worst&lt;/strong&gt; absolute load times both with and without ads.&lt;/p&gt;

&lt;p&gt;Overall, it’s evident that running ads from Google on your site will slow things down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layouts are Shifting Too
&lt;/h2&gt;

&lt;p&gt;Have you ever tried to click a link on a website as its loading, only to see the link shift down and another element on the page get clicked in its place? This is called a &lt;a href="https://requestmetrics.com/web-performance/cumulative-layout-shift" rel="noopener noreferrer"&gt;layout shift&lt;/a&gt;, and it happens when new content forces existing elements to move and make space.&lt;/p&gt;

&lt;p&gt;Layout shifts are &lt;em&gt;very&lt;/em&gt; common on sites with advertising. Ads are often large, and loaded after part of the page has already rendered. The CNN video above shows a classic example of a large and user-hostile layout shift as the banner ad comes in.&lt;/p&gt;

&lt;p&gt;Google measures this behavior as a &lt;a href="https://web.dev/vitals/" rel="noopener noreferrer"&gt;Core Web Vital&lt;/a&gt; called Cumulative Layout Shift (CLS). In addition to measuring load performance impact, we wanted to see whether ads contributed to greater layout shifts by measuring their CLS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cumulative Layout Shift Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;No Ads&lt;/th&gt;
&lt;th&gt;With Ads&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;0.208&lt;/td&gt;
&lt;td&gt;0.031&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.7x better*&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;espn.com&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cnn.com&lt;/td&gt;
&lt;td&gt;0.102&lt;/td&gt;
&lt;td&gt;0.19&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.9x worse&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wsj.com&lt;/td&gt;
&lt;td&gt;0.009&lt;/td&gt;
&lt;td&gt;0.087&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.6x worse&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;foxnews.com&lt;/td&gt;
&lt;td&gt;0.021&lt;/td&gt;
&lt;td&gt;1.06&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50x worse&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Cumulative Layout Shift With and Without Google Ads&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The results here aren’t as clear cut. ESPN does a great job limiting layout shift in both cases. The New York Times actually has a &lt;em&gt;better&lt;/em&gt; CLS score with ads enabled! (More on that below)&lt;/p&gt;

&lt;p&gt;However, three of the five sites still have a much worse layout shift score with ads enabled than without. So in general, layout shifts are something you’ll want to monitor if you’re using Google ads.&lt;/p&gt;

&lt;h3&gt;
  
  
  The New York Times Has a Better CLS Score With Ads Enabled?
&lt;/h3&gt;

&lt;p&gt;The New York times website is reserving space using CSS for the large banner ad at the top of their site. When the ad pops in, it’s not causing any re-flow or layout shift because the space already exists for it.&lt;/p&gt;


        
    

&lt;p&gt;When ads are disabled, the placeholder collapses, causing a larger layout shift than if ads were enabled!&lt;/p&gt;

&lt;p&gt;One &lt;em&gt;could&lt;/em&gt; make an argument that no banner ad at all would be better, but then they probably wouldn’t have the cash to buy Wordle, so it’s pros and cons.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Improve Google Ad Performance
&lt;/h2&gt;

&lt;p&gt;In almost all cases the revenue generated by Google ads outweighs their performance costs, so removing them is probably not an option. There are still some things that can be done to mitigate their performance hit though.&lt;/p&gt;

&lt;h3&gt;
  
  
  Load Scripts Statically
&lt;/h3&gt;

&lt;p&gt;It’s not uncommon to see sites using dynamic script loading to inject the Google ad tags. You might see something like this on your site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://securepubads.g.doubleclick.net/tag/js/gpt.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of using a dynamic script loader, which can be delayed by other events and elements on the page, it’s better to use &lt;a href="https://developers.google.com/publisher-ads-audits/reference/audits/script-injected-tags" rel="noopener noreferrer"&gt;statically defined async scripts&lt;/a&gt;, like the examples below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Script Loading, Asynchronously
&lt;/h3&gt;

&lt;p&gt;Google suggests their scripts should be &lt;a href="https://developers.google.com/publisher-ads-audits/reference/audits/async-ad-tags" rel="noopener noreferrer"&gt;loaded asynchronously&lt;/a&gt;, so as not to block page load.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Use of the async attribute on the script tag can help defer load --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- For Adsense --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!--Or using the Google Publisher Tag--&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://securepubads.g.doubleclick.net/tag/js/gpt.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despite this advice, many sites are still loading ad scripts with slow dynamic loaders, or synchronously loading static script tags.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lazy Load Ads Below The Fold
&lt;/h3&gt;

&lt;p&gt;There’s no sense is waiting for an ad to load that the user can’t even see. When possible, load ads below the fold lazily - preventing load blocking. Google has a &lt;a href="https://developers.google.com/publisher-tag/samples/lazy-loading" rel="noopener noreferrer"&gt;nice lazy load example&lt;/a&gt; if you’re using &lt;strong&gt;Google Publisher Tag&lt;/strong&gt;. Google even hosts a demo so you can &lt;a href="https://googleads.github.io/google-publisher-tag-samples/advanced/lazy-loading/demo.html" rel="noopener noreferrer"&gt;see it in action&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reserve Size For Above-the-Fold Ads
&lt;/h3&gt;

&lt;p&gt;Preventing layout shift is just as important as optimizing page load performance. The easiest way to prevent frustrating layout shifts for users is to reserve space for your ads, like the New York Times does. The simplest way to reserve space is using the &lt;code&gt;min-width&lt;/code&gt; and &lt;code&gt;min-height&lt;/code&gt; CSS properties to define a placeholder size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"banner-ad"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"min-width: 600px; min-height: 200px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multiple Content Sizes
&lt;/h3&gt;

&lt;p&gt;Sometimes ads have multiple sizes, and in that case you’ll have a decision to make with regards to reserving space. Common strategies are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reserve space for the largest content size&lt;/li&gt;
&lt;li&gt;Reserve space for the smallest content size&lt;/li&gt;
&lt;li&gt;Reserve size for the most commonly served content size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google has &lt;a href="https://developers.google.com/publisher-tag/guides/minimize-layout-shift#minimize" rel="noopener noreferrer"&gt;more information regarding layout shifts&lt;/a&gt; and ad best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ads may be necessary on a site, but it’s important to minimize performance impact as much as possible. If you’re using Google Ads, &lt;a href="https://app.requestmetrics.com/signup" rel="noopener noreferrer"&gt;give Request Metrics a try and improve your site’s performance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Request Metrics will monitor Cumulative Layout Shift, load performance, and dozens of other metrics, for every user on your site. You’ll get up-to-date metrics that show you exactly how your site is performing. You’ll also get 90 days of historical data to see if things are trending in the right direction.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>sre</category>
      <category>o11y</category>
      <category>advertising</category>
    </item>
    <item>
      <title>Web Performance Profiling: Nike.com</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Wed, 06 Jul 2022 00:00:00 +0000</pubDate>
      <link>https://community.ops.io/requestmetrics/web-performance-profiling-nikecom-1h9o</link>
      <guid>https://community.ops.io/requestmetrics/web-performance-profiling-nikecom-1h9o</guid>
      <description>&lt;p&gt;Google has &lt;a href="https://webmasters.googleblog.com/2010/04/using-site-speed-in-web-search-ranking.html" rel="noopener noreferrer"&gt;long used website performance&lt;/a&gt; as a &lt;a href="https://webmasters.googleblog.com/2018/01/using-page-speed-in-mobile-search.html" rel="noopener noreferrer"&gt;ranking criteria&lt;/a&gt; for search results. Despite the importance of &lt;a href="https://webmasters.googleblog.com/2020/05/evaluating-page-experience.html" rel="noopener noreferrer"&gt;page experience&lt;/a&gt; for SEO, many sites still suffer unacceptable load times. Poor performance is often a confluence of factors: slow time to first byte, hundreds of resource requests, and way too much JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nike.com Is Slow
&lt;/h2&gt;

&lt;p&gt;Let’s look at a popular online retailer: &lt;a href="https://www.nike.com" rel="noopener noreferrer"&gt;Nike.com&lt;/a&gt;. With outdoor exercise increasing in popularity post-COVID, Nike’s running shoe offerings are compelling (arguably &lt;a href="https://en.wikipedia.org/wiki/Nike_Vaporfly_and_Tokyo_2020_Olympics_Controversy" rel="noopener noreferrer"&gt;too compelling&lt;/a&gt;) and we want to buy some.&lt;/p&gt;

&lt;p&gt;But the experience on mobile when we navigate to a &lt;a href="https://www.nike.com/t/air-vapormax-2020-fk-ms-mens-shoe-jNbjTr/CZ9313-001" rel="noopener noreferrer"&gt;product details page&lt;/a&gt; for a VaporFly shoe is slow and janky.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/37CA0K2LflEQvulHOOfsVhCuUk5yxNIBfJF5dfXlQSc/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2FkZWE5/djVnN2JmM3p5YTM2/NGRrLmdpZg" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/37CA0K2LflEQvulHOOfsVhCuUk5yxNIBfJF5dfXlQSc/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2FkZWE5/djVnN2JmM3p5YTM2/NGRrLmdpZg" alt="Video of Nike Product Details Page Loading" width="356" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There’s a few obvious problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The page takes a long time to load. Subjective to be sure, but it’s over &lt;strong&gt;5&lt;/strong&gt; seconds.&lt;/li&gt;
&lt;li&gt;There are multiple asynchronous parts rendering at different times causing contentful paint events. (The free shipping banner, the “Sign in to Buy” button etc.)&lt;/li&gt;
&lt;li&gt;There are &lt;a href="https://requestmetrics.com/web-performance/cumulative-layout-shift" rel="noopener noreferrer"&gt;several layout shifts&lt;/a&gt; occurring making the page load look janky. Particularly jarring is the product image render
ing below the title and then jumping above it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can see that the page “feels” slow, but can we quantify it? Can we determine which specific pieces are responsible for the slowness?&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Auditing with Chrome
&lt;/h2&gt;

&lt;p&gt;Chrome has great performance diagnostic tools. We’ll start on the Network tab of the developer tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/DPkOsYRgGL-P5mRG_wnxnBQuC5Ke_hw-IfznEhhcWpk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2pndGI0/MGs4ZGV2M2Fxdzh3/NTVlLmdpZg" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/DPkOsYRgGL-P5mRG_wnxnBQuC5Ke_hw-IfznEhhcWpk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2pndGI0/MGs4ZGV2M2Fxdzh3/NTVlLmdpZg" alt="Network Tab view of the same page load" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This gives us some quantitative metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The initial document took &lt;strong&gt;143ms&lt;/strong&gt; to return from the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;283&lt;/strong&gt; total requests to load the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5.7MB&lt;/strong&gt; transferred over the wire.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12.9MB&lt;/strong&gt; of uncompressed resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5.6&lt;/strong&gt; seconds to finish.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;283&lt;/strong&gt; requests is unexpectedly high, and overboard for a product details page (or really, anything). That number of requests is going to put a floor on how fast a site can be, regardless of any other improvements.&lt;/p&gt;

&lt;p&gt;Many of the requests are served over HTTP/2, &lt;a href="https://developers.google.com/web/fundamentals/performance/http2#request_and_response_multiplexing" rel="noopener noreferrer"&gt;which does help with multiplexing&lt;/a&gt;, but it would still be better for performance to make dramatically fewer calls.&lt;/p&gt;

&lt;p&gt;We can investigate further by filtering the Network tab to specific resource types. This let’s us see the size and number of requests for each type (JS, CSS etc).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/35gOtTclCl1SPi6IE60mbWMDN6cISqyrEbplmgJ8WC0/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2dxZGl6/dTNsaWg5ZXJjMGNq/cmp4LmdpZg" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/35gOtTclCl1SPi6IE60mbWMDN6cISqyrEbplmgJ8WC0/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2dxZGl6/dTNsaWg5ZXJjMGNq/cmp4LmdpZg" alt="Resource breakdown of requests and asset size" width="553" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few things stand out. First, &lt;strong&gt;87&lt;/strong&gt; requests totaling &lt;strong&gt;8.9MB&lt;/strong&gt; of JavaScript! That is a lot of JavaScript! There are also &lt;strong&gt;72&lt;/strong&gt; XHR/Fetch requests during page load which feels like too many. &lt;strong&gt;46&lt;/strong&gt; image requests is also pushing it, but that’s not a huge surprise on an e-commerce site like this. The most concerning thing here is the number of JS requests, and the overall size of the script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagnosing JavaScript Issues with Chrome Performance Audit
&lt;/h2&gt;

&lt;p&gt;We can use the &lt;strong&gt;“Performance”&lt;/strong&gt; audit feature in the developer tools to find out what’s going on with the JavaScript on this page.&lt;/p&gt;

&lt;p&gt;Creating a performance profile gives us a snapshot of a specific page load. We get detailed flame graphs and timelines of what’s happening. If you want to play along, &lt;a href="https://requestmetrics.com/assets/images/webperf/perf-nike/nike-profile.json" rel="noopener noreferrer"&gt;download the profile&lt;/a&gt; used in this tutorial, and load it in to Chrome to take a look.&lt;/p&gt;

&lt;p&gt;There is a lot of information displayed in our Chrome performance profile. It can look daunting at first. Let’s break it down and go through each section individually.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/EU-eLlFv2g_DJLIF798K4zTcOrTqe_0GNZPLMs5DPRE/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2dxaXZt/OG9uMXRremxwd2Rx/bzMzLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/EU-eLlFv2g_DJLIF798K4zTcOrTqe_0GNZPLMs5DPRE/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2dxaXZt/OG9uMXRremxwd2Rx/bzMzLnBuZw" alt="Performance tab view of our page load" width="667" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Section 1: CPU, Network and Frames Per Second Timeline
&lt;/h3&gt;

&lt;p&gt;The top section ( &lt;strong&gt;1&lt;/strong&gt; ) is where frames per second, network activity and CPU utilization are graphed over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/1dDEsMiYm9NkwjX-GGW0ZmV3VdoOlTwvNAmwppF2Rsk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL256dXR6/MnpyYjg3dW5udjNl/bWRxLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/1dDEsMiYm9NkwjX-GGW0ZmV3VdoOlTwvNAmwppF2Rsk/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL256dXR6/MnpyYjg3dW5udjNl/bWRxLnBuZw" alt="A close up showing high CPU usage for scripting and rendering" width="454" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those little red lines at the top are long running tasks. Below that, in green, is the number of frames per second (FPS) the browser is rendering at. Higher is better. The lower the FPS the more jerky animations will look to the user. Below the FPS graph there’s the CPU usage meter. Yellow represents CPU time spent executing JavaScript, while purple is CPU time spent rendering.&lt;/p&gt;

&lt;p&gt;Overall this graph tells us something specific. The long running tasks occurring in JavaScript are eating CPU and killing frames per second. When each long running task finally completes, the browser spends time rendering. This is a common usage pattern in poorly optimized/structured single page applications (SPAs).&lt;/p&gt;

&lt;h3&gt;
  
  
  Section 2: Flame Graphs and Page Lifecycle
&lt;/h3&gt;

&lt;p&gt;The middle section of the performance profile ( &lt;strong&gt;2&lt;/strong&gt; ) shows detailed flame graphs representing animations, JavaScript function timings and page lifecycle events.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/jIAmGngReSwWtFdb73li9jUn7He1lOMrsZy5GVcnIE4/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3NrYWoz/MndyanAzcGJram96/YzV3LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/jIAmGngReSwWtFdb73li9jUn7He1lOMrsZy5GVcnIE4/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3NrYWoz/MndyanAzcGJram96/YzV3LnBuZw" alt="A close up showing the flame charts in the performance profile" width="686" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The red “L” is the &lt;code&gt;OnLoad&lt;/code&gt; event firing. &lt;a href="https://requestmetrics.com/web-performance/largest-contentful-paint" rel="noopener noreferrer"&gt;&lt;code&gt;Largest Contentful Paint (LCP)&lt;/code&gt;&lt;/a&gt; and &lt;code&gt;First Contentful Paint (FCP)&lt;/code&gt; are shown as well. We also get more detailed information on just how long some tasks were taking. These longer tasks are good places to start when investigating why the script execution is taking so long.&lt;/p&gt;

&lt;h3&gt;
  
  
  Section 3: Summary and Aggregate Lists
&lt;/h3&gt;

&lt;p&gt;The bottom section of the profile ( &lt;strong&gt;3&lt;/strong&gt; ) shows summary and list data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/PffdG9iJZ9cFQOa8itju0JAMZ4F8gkp0n2-QYELn9P0/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3MzNzI1/cDIyZTU2cXE3NXUw/ODNtLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/PffdG9iJZ9cFQOa8itju0JAMZ4F8gkp0n2-QYELn9P0/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3MzNzI1/cDIyZTU2cXE3NXUw/ODNtLnBuZw" alt="Summary of time spent during page load." width="457" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This confirms what we suspect - scripting accounts for a majority ( &lt;strong&gt;70%&lt;/strong&gt; ) of the total time during page load. Rendering takes up the next largest chunk at &lt;strong&gt;12%&lt;/strong&gt; and is probably correlated to heavy JS usage. That is, the work JavaScript is doing ultimately results in a change to the DOM, causing rendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analysis of Scripting in the Performance Profile
&lt;/h2&gt;

&lt;p&gt;A good place to start when investigating script issues is the “Bottom Up” tab. This gives us a more granular view of the pie chart from the Summary tab. We can see similar time taken percentages here, but now we can expand the arrows and dive deeper.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/xEfE_NLeIccp3u_rUEEX0yG9FRPZRJH9QPZ-AZNW66Y/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3lmamFw/ZnRvOWQxbnlxcDV3/cjZoLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/xEfE_NLeIccp3u_rUEEX0yG9FRPZRJH9QPZ-AZNW66Y/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3lmamFw/ZnRvOWQxbnlxcDV3/cjZoLnBuZw" alt="Time taken by activity" width="597" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we click in to each of these activities we get a much more detailed picture of where the time is going. Drilling in to the top-level “JavaScript” section, we see a list of the functions Chrome is spending the most time in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/_vqfGbCXC5jdftGUlgdagRLXyS-Iwm5qp6hPfu7Kj-o/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzFlNTl5/OXd1cGJobG1zb2pm/eG5wLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/_vqfGbCXC5jdftGUlgdagRLXyS-Iwm5qp6hPfu7Kj-o/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzFlNTl5/OXd1cGJobG1zb2pm/eG5wLnBuZw" alt="JavaScript time taken by function" width="601" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the file names, it’s clear that a large portion of our time is spent inside React. Given the number of renders and the high CPU/low FPS, it’s likely the application is in significant need of optimization!&lt;/p&gt;

&lt;p&gt;We can see that &lt;code&gt;setState&lt;/code&gt; is prominently represented in the list, and repeated calls to &lt;code&gt;setState&lt;/code&gt; will often cause layout thrashing and other poor performance issues. In terms of code improvement, drilling in to these React functions would be a good place to start!&lt;/p&gt;

&lt;h2&gt;
  
  
  So JavaScript is Why Nike.com is so Slow?
&lt;/h2&gt;

&lt;p&gt;As with most sites, there is no single smoking gun causing all of the performance problems. In this case, &lt;strong&gt;87&lt;/strong&gt; JS file requests and almost &lt;strong&gt;9MB&lt;/strong&gt; of uncompressed JavaScript are certainly a big factor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unoptimized Single Page Application
&lt;/h3&gt;

&lt;p&gt;We know from the graphs that script execution is pegging the CPU and frames per second is suffering. We also know that there are too many renders occurring throughout the page lifecycle. Coupled with the amount of time spent in React, we can conclude that the React application is a large part of the problem! Spending time performance tuning the React application would help address the layout shifts and numerous contentful paints.&lt;/p&gt;

&lt;h3&gt;
  
  
  Too Many Scripts
&lt;/h3&gt;

&lt;p&gt;There’s another JavaScript related performance problem too. Let’s look at another view of the “Bottom Up” tab on the performance profile, this time grouped by script URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/xM-gm_EnpKAeFu2aTik6EqkV_Mm-5ADx-GQzXPUKI2c/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3FjOGQy/N2dmY3czb3BteWxu/bmZ4LmdpZg" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/xM-gm_EnpKAeFu2aTik6EqkV_Mm-5ADx-GQzXPUKI2c/rt:fit/w:800/g:sm/q:0/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3FjOGQy/N2dmY3czb3BteWxu/bmZ4LmdpZg" alt="All the different scripts involved on the page" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No wonder there are 87 requests and 8.9MB of script! There are numerous third party analytics and marketing products represented here, along with evidence of the internal corporate structure of Nike’s software teams. In short, this list is too long. Each of these scripts has a cost in terms of performance, and also maintenance and user experience/quality.&lt;/p&gt;

&lt;p&gt;If Nike wanted to improve their site’s performance they would do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimize their React app. Ensure judicious use of &lt;code&gt;setState&lt;/code&gt;. The amount of jank/layout shift on page load, coupled with the pegged CPU, strongly suggests that there are ample opportunities to batch state updates or do less work.&lt;/li&gt;
&lt;li&gt;Remove some of their analytics and tracking third parties. There’s too many cooks in the kitchen here and each one could be contributing to poor page experience.&lt;/li&gt;
&lt;li&gt;Consolidate some of their first-party scripts. There’s dozens of scripts loaded from all over nike.com. It’s &lt;a href="https://en.wikipedia.org/wiki/Conway%27s_law" rel="noopener noreferrer"&gt;Conway’s Law&lt;/a&gt; in action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Making these changes would be a big start towards improving performance on Nike.com!&lt;/p&gt;

</description>
      <category>performance</category>
      <category>webdev</category>
      <category>sre</category>
      <category>o11y</category>
    </item>
  </channel>
</rss>
