📋 Inhaltsverzeichnis
Web PerformanceMonitoring
Umfassender Guide zu Web Performance Monitoring – Metriken, Tools und Best Practices für optimale Website-Performance und bessere User Experience. Performance Monitoring ist essentiell für moderne Web-Anwendungen, da es Einblicke in Ladezeiten, Benutzerinteraktionen und Core Web Vitals bietet. Professionelles Web Performance Monitoring hilft dabei, Engpässe zu identifizieren und die User Experience kontinuierlich zu verbessern. Lernen Sie, wie Performance Monitoring-Tools eingesetzt werden und welche Metriken für Ihr Business kritisch sind.
🚀 Was ist Web Performance Monitoring?
Web Performance Monitoring (WPM) ist der kontinuierliche Prozess der Überwachung, Messung und Analyse der Geschwindigkeit und Verfügbarkeit einer Website oder Webanwendung. Ziel ist es, eine optimale User Experience sicherzustellen und Business-Ziele zu erreichen.
- Echtzeitüberwachung: Kontinuierliche Messung der Website-Performance
- Problemerkennung: Frühzeitige Identifikation von Performance-Problemen
- User Experience: Verbesserung der Nutzererfahrung durch optimierte Ladezeiten
- Business Impact: Direkte Auswirkung auf Konversionsraten und ROI
⚡ Core Web Vitals
Core Web Vitals sind Googles wichtigste Metriken für die User Experience:
LCP
Largest Contentful Paint
Ziel: < 2.5s
FID
First Input Delay
Ziel: < 100ms
CLS
Cumulative Layout Shift
Ziel: < 0.1
// Core Web Vitals messen mit Web Vitals Library
import { getCLS, getFID, getFCP, getLCP, getTTFB } from 'web-vitals';
getCLS(console.log);
getFID(console.log);
getFCP(console.log);
getLCP(console.log);
getTTFB(console.log);
// Performance Observer API
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
if (entry.entryType === 'largest-contentful-paint') {
console.log('LCP:', entry.startTime);
}
});
});
observer.observe({ type: 'largest-contentful-paint', buffered: true });
📊 Wichtige Performance-Metriken
Ladezeit-Metriken
TTFB (Time to First Byte)
Zeit bis zum ersten Byte vom Server
Ziel: < 200ms
FCP (First Contentful Paint)
Erster sichtbarer Content
Ziel: < 1.8s
Speed Index
Geschwindigkeit der visuellen Darstellung
Ziel: < 3.4s
TTI (Time to Interactive)
Zeit bis zur vollständigen Interaktivität
Ziel: < 3.8s
🛠️ Monitoring Tools & Techniken
Browser-basierte Tools
- Chrome DevTools: Performance Tab, Lighthouse, Network Tab
- Firefox Developer Tools: Performance Panel, Network Monitor
- Edge DevTools: Performance Profiler, Issues Tab
Online Testing Services
// PageSpeed Insights API
const PSI_API_KEY = 'your-api-key';
const url = 'https://example.com';
const response = await fetch(
`https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${url}&key=${PSI_API_KEY}`
);
const data = await response.json();
console.log('Performance Score:', data.lighthouseResult.categories.performance.score * 100);
console.log('LCP:', data.lighthouseResult.audits['largest-contentful-paint'].displayValue);
Enterprise Monitoring Solutions
Real User Monitoring (RUM)
- • Google Analytics 4
- • New Relic Browser
- • Datadog RUM
- • Sentry Performance
Synthetic Monitoring
- • Pingdom
- • GTmetrix
- • WebPageTest
- • Lighthouse CI
🔄 RUM vs. Synthetic Monitoring
Real User Monitoring (RUM)
- ✅ Echte Nutzerdaten
- ✅ Verschiedene Geräte & Netzwerke
- ✅ Geografische Verteilung
- ❌ Reactive (nach Problemen)
- ❌ Benötigt Traffic
Synthetic Monitoring
- ✅ Proaktive Überwachung
- ✅ Kontrollierte Bedingungen
- ✅ Funktioniert ohne Traffic
- ❌ Simulierte Umgebung
- ❌ Begrenzte Realitätsnähe
⚙️ Implementierung & Best Practices
Performance Monitoring Setup
// Custom Performance Monitoring
class PerformanceMonitor {
constructor() {
this.metrics = {};
this.setupObservers();
}
setupObservers() {
// Navigation Timing
window.addEventListener('load', () => {
const navigation = performance.getEntriesByType('navigation')[0];
this.metrics.pageLoadTime = navigation.loadEventEnd - navigation.navigationStart;
this.metrics.domContentLoaded = navigation.domContentLoadedEventEnd - navigation.navigationStart;
this.metrics.ttfb = navigation.responseStart - navigation.navigationStart;
});
// Performance Observer für Web Vitals
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach(entry => {
switch (entry.entryType) {
case 'largest-contentful-paint':
this.metrics.lcp = entry.startTime;
break;
case 'first-input':
this.metrics.fid = entry.processingStart - entry.startTime;
break;
case 'layout-shift':
if (!entry.hadRecentInput) {
this.metrics.cls = (this.metrics.cls || 0) + entry.value;
}
break;
}
});
});
observer.observe({
type: 'largest-contentful-paint',
buffered: true
});
observer.observe({
type: 'first-input',
buffered: true
});
observer.observe({
type: 'layout-shift',
buffered: true
});
}
sendMetrics() {
// An Analytics-Service senden
fetch('/api/performance', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
...this.metrics,
url: window.location.href,
userAgent: navigator.userAgent,
timestamp: Date.now()
})
});
}
}
// Initialisierung
const monitor = new PerformanceMonitor();
window.addEventListener('beforeunload', () => monitor.sendMetrics());
💰 Performance Budgets
Performance Budgets definieren klare Grenzen für wichtige Metriken und helfen dabei, Performance-Regression zu vermeiden.
// lighthouse-budget.json
{
"path": "/*",
"timings": [
{
"metric": "first-contentful-paint",
"budget": 2000
},
{
"metric": "largest-contentful-paint",
"budget": 2500
},
{
"metric": "speed-index",
"budget": 3000
}
],
"resourceSizes": [
{
"resourceType": "script",
"budget": 300
},
{
"resourceType": "image",
"budget": 500
},
{
"resourceType": "total",
"budget": 1000
}
]
}
🎯 Optimierungsstrategien
Frontend Optimierungen
- Code Splitting: Nur notwendigen Code laden
- Lazy Loading: Bilder und Komponenten bei Bedarf laden
- Resource Hints: dns-prefetch, preconnect, prefetch
- Caching: Browser-Cache und Service Worker nutzen
- Minification: CSS, JS und HTML komprimieren
Backend Optimierungen
- CDN: Content Delivery Network für statische Assets
- Compression: Gzip/Brotli für Textinhalte
- Database Optimization: Queries und Indizes optimieren
- Server Response Time: TTFB unter 200ms halten
- HTTP/2 & HTTP/3: Moderne Protokolle nutzen
💡 Praktische Beispiele
Next.js Performance Monitoring
// pages/_app.js - Next.js Web Vitals Reporting
export function reportWebVitals(metric) {
const { id, name, label, value } = metric;
// An Analytics-Service senden
gtag('event', name, {
event_category: label === 'web-vital' ? 'Web Vitals' : 'Next.js custom metric',
value: Math.round(name === 'CLS' ? value * 1000 : value),
event_label: id,
non_interaction: true,
});
// Oder an eigenen Service
fetch('/api/analytics', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
metric: name,
value,
label,
id,
url: window.location.href
})
});
}
// Lighthouse CI Integration
// .lighthouserc.js
module.exports = {
ci: {
collect: {
url: ['http://localhost:3000'],
numberOfRuns: 3,
},
assert: {
assertions: {
'categories:performance': ['error', { minScore: 0.9 }],
'categories:accessibility': ['error', { minScore: 0.9 }],
'categories:best-practices': ['error', { minScore: 0.9 }],
'categories:seo': ['error', { minScore: 0.9 }],
},
},
upload: {
target: 'lhci',
serverBaseUrl: 'https://your-lhci-server.com',
},
},
};