项目中实际如何运用性能监控

🔧 项目中实际如何运用性能监控(实战指南)

让我用一个真实项目案例来说明性能监控是如何落地应用的。假设我们有一个电商网站,我会展示从零到一的完整实现。


📦 第一步:项目基础配置

1. 安装和初始化

# 创建监控SDK目录
mkdir -p src/utils/monitoring
cd src/utils/monitoring

2. 基础监控SDK (monitoring.js)

// 简单实用的监控SDK - 直接复制使用
class PerformanceMonitor {
  constructor(options = {}) {
    this.config = {
      endpoint: options.endpoint || 'https://your-api.com/collect',
      sampleRate: options.sampleRate || 0.1, // 10%采样率
      enableLogging: options.enableLogging || process.env.NODE_ENV !== 'production'
    };
    
    this.queue = [];
    this.init();
  }

  // 初始化核心监控
  init() {
    // 1. 页面加载性能
    this.trackPageLoad();
    
    // 2. 核心Web指标
    this.trackCoreWebVitals();
    
    // 3. 资源加载
    this.trackResources();
    
    // 4. API请求监控
    this.trackAPIRequests();
    
    // 5. 错误监控
    this.trackErrors();
    
    // 6. 用户交互
    this.trackUserInteractions();
    
    // 定期上报
    setInterval(() => this.flush(), 10000);
    window.addEventListener('beforeunload', () => this.flush(true));
  }

  // 🛒 实战:电商页面加载监控
  trackPageLoad() {
    // 记录页面开始加载时间
    window.pageStartTime = Date.now();
    
    window.addEventListener('load', () => {
      const loadTime = Date.now() - window.pageStartTime;
      
      this.sendMetric('page_load', {
        duration: loadTime,
        url: window.location.href,
        referrer: document.referrer
      });
    });
  }

  // 🛒 实战:监控关键业务按钮点击
  trackUserInteractions() {
    // 监控"加入购物车"按钮
    document.addEventListener('click', (e) => {
      const button = e.target.closest('button, a');
      if (!button) return;
      
      // 关键业务按钮识别
      const buttonText = button.textContent.toLowerCase();
      const criticalActions = ['加入购物车', '立即购买', '结算', '提交订单'];
      
      if (criticalActions.some(action => buttonText.includes(action))) {
        this.sendMetric('critical_click', {
          action: buttonText,
          page: window.location.pathname,
          timestamp: Date.now()
        });
      }
    });
  }

  // 🛒 实战:监控API请求(特别关注下单接口)
  trackAPIRequests() {
    const originalFetch = window.fetch;
    
    window.fetch = async (...args) => {
      const startTime = performance.now();
      const url = args[0];
      
      try {
        const response = await originalFetch(...args);
        const endTime = performance.now();
        
        // 重点监控下单相关接口
        if (url.includes('/api/order') || url.includes('/api/checkout')) {
          this.sendMetric('api_request', {
            url: url.toString(),
            duration: endTime - startTime,
            status: response.status,
            success: response.ok
          });
        }
        
        return response;
      } catch (error) {
        const endTime = performance.now();
        this.sendMetric('api_error', {
          url: url.toString(),
          duration: endTime - startTime,
          error: error.message
        });
        throw error;
      }
    };
  }

  // 发送数据(简化版)
  sendMetric(type, data) {
    // 采样控制
    if (Math.random() > this.config.sampleRate) return;
    
    const metric = {
      type,
      data,
      timestamp: Date.now(),
      userAgent: navigator.userAgent,
      pageUrl: window.location.href,
      screen: `${window.screen.width}x${window.screen.height}`
    };
    
    this.queue.push(metric);
    
    // 本地开发环境打印日志
    if (this.config.enableLogging) {
      console.log('[监控]', type, data);
    }
  }

  // 上报数据
  async flush(isUrgent = false) {
    if (this.queue.length === 0) return;
    
    const batch = this.queue.splice(0, 20);
    
    try {
      // 使用sendBeacon在页面关闭时可靠上报
      if (isUrgent && navigator.sendBeacon) {
        const blob = new Blob([JSON.stringify({ metrics: batch })], {
          type: 'application/json'
        });
        navigator.sendBeacon(this.config.endpoint, blob);
      } else {
        // 正常上报
        await fetch(this.config.endpoint, {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ metrics: batch }),
          keepalive: isUrgent // 页面卸载时保持连接
        });
      }
    } catch (error) {
      console.warn('监控数据上报失败:', error);
      // 失败的数据放回队列
      this.queue.unshift(...batch);
    }
  }

  // 业务自定义埋点方法
  trackEvent(name, properties = {}) {
    this.sendMetric('custom_event', {
      name,
      ...properties
    });
  }
}

// 导出单例
export const monitor = new PerformanceMonitor({
  endpoint: process.env.REACT_APP_MONITORING_URL,
  sampleRate: parseFloat(process.env.REACT_APP_SAMPLE_RATE || '0.1')
});

🛒 第二步:电商项目中的实际应用

1. 在React项目中集成

// src/index.js - 应用入口文件
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { monitor } from './utils/monitoring';

// 监控React应用错误
class ErrorBoundary extends React.Component {
  componentDidCatch(error, errorInfo) {
    monitor.sendMetric('react_error', {
      error: error.toString(),
      stack: errorInfo.componentStack,
      page: window.location.href
    });
    
    // 显示友好错误页面
    this.setState({ hasError: true });
  }

  render() {
    if (this.state?.hasError) {
      return <h1>页面出错了,请刷新重试</h1>;
    }
    return this.props.children;
  }
}

ReactDOM.render(
  <React.StrictMode>
    <ErrorBoundary>
      <App />
    </ErrorBoundary>
  </React.StrictMode>,
  document.getElementById('root')
);

2. 监控关键业务组件

// src/components/ProductDetail.jsx - 商品详情页
import React, { useEffect, useState } from 'react';
import { monitor } from '../utils/monitoring';

function ProductDetail({ productId }) {
  const [product, setProduct] = useState(null);
  const [loading, setLoading] = useState(true);
  
  // 监控组件加载时间
  useEffect(() => {
    const startTime = performance.now();
    
    // 模拟数据加载
    fetchProduct(productId).then(data => {
      setProduct(data);
      setLoading(false);
      
      // 记录加载耗时
      const loadTime = performance.now() - startTime;
      monitor.sendMetric('product_detail_load', {
        productId,
        duration: loadTime,
        success: true
      });
    }).catch(error => {
      monitor.sendMetric('product_detail_error', {
        productId,
        error: error.message,
        duration: performance.now() - startTime
      });
    });
  }, [productId]);
  
  // 监控"加入购物车"操作
  const handleAddToCart = () => {
    const startTime = performance.now();
    
    // 业务逻辑...
    addToCart(productId).then(() => {
      const duration = performance.now() - startTime;
      
      // 关键业务埋点
      monitor.trackEvent('add_to_cart', {
        productId,
        productName: product.name,
        price: product.price,
        duration,
        success: true
      });
      
      // 同时触发业务指标
      monitor.sendMetric('cart_operation', {
        action: 'add',
        duration,
        productCount: 1
      });
    });
  };
  
  if (loading) return <div>加载中...</div>;
  
  return (
    <div className="product-detail">
      <h1>{product.name}</h1>
      <p>价格: ¥{product.price}</p>
      <button onClick={handleAddToCart}>
        加入购物车
      </button>
    </div>
  );
}

3. 监控购物车流程

// src/utils/checkoutMonitor.js - 购物车结算流程监控
class CheckoutMonitor {
  constructor() {
    this.steps = {};
    this.currentStep = null;
  }
  
  // 开始结算流程
  startCheckout(userId, cartItems) {
    this.steps = {
      userId,
      cartItemCount: cartItems.length,
      totalAmount: cartItems.reduce((sum, item) => sum + item.price, 0),
      startTime: performance.now(),
      steps: {}
    };
    
    monitor.trackEvent('checkout_started', this.steps);
  }
  
  // 记录步骤
  markStep(stepName, data = {}) {
    if (this.currentStep) {
      // 结束前一个步骤
      const stepDuration = performance.now() - this.steps.steps[this.currentStep].startTime;
      this.steps.steps[this.currentStep].endTime = performance.now();
      this.steps.steps[this.currentStep].duration = stepDuration;
    }
    
    // 开始新步骤
    this.currentStep = stepName;
    this.steps.steps[stepName] = {
      startTime: performance.now(),
      ...data
    };
  }
  
  // 结束流程
  endCheckout(success, orderId = null, error = null) {
    if (this.currentStep) {
      this.markStep('end');
    }
    
    const totalDuration = performance.now() - this.steps.startTime;
    
    const checkoutData = {
      ...this.steps,
      totalDuration,
      success,
      orderId,
      error,
      timestamp: Date.now()
    };
    
    // 上报完整结算流程数据
    monitor.sendMetric('checkout_complete', checkoutData);
    
    // 如果是失败,触发告警
    if (!success) {
      monitor.sendMetric('checkout_failed', {
        ...checkoutData,
        severity: 'high'
      });
    }
  }
}

// 使用示例
const checkoutMonitor = new CheckoutMonitor();

// 用户点击结算按钮
function handleCheckout() {
  const cartItems = getCartItems();
  checkoutMonitor.startCheckout('user123', cartItems);
  checkoutMonitor.markStep('address_selection');
  
  // 用户选择地址后
  // checkoutMonitor.markStep('payment_selection');
  
  // 支付成功后
  // checkoutMonitor.endCheckout(true, 'order_456');
  
  // 支付失败
  // checkoutMonitor.endCheckout(false, null, '支付失败');
}

📊 第三步:数据看板和分析

1. 简单的实时监控面板(前端实现)

// src/components/PerformanceDashboard.jsx - 开发环境监控面板
import React, { useState, useEffect } from 'react';
import { monitor } from '../utils/monitoring';

function PerformanceDashboard() {
  const [metrics, setMetrics] = useState({
    pageLoad: [],
    apiRequests: [],
    errors: [],
    webVitals: {}
  });
  
  const [alerts, setAlerts] = useState([]);
  
  useEffect(() => {
    // 只在开发环境显示
    if (process.env.NODE_ENV === 'production') return;
    
    // 监听控制台日志
    const originalConsole = {
      log: console.log,
      warn: console.warn,
      error: console.error
    };
    
    console.log = (...args) => {
      originalConsole.log(...args);
      monitor.sendMetric('console_log', { args });
    };
    
    console.error = (...args) => {
      originalConsole.error(...args);
      const errorData = { args, timestamp: Date.now() };
      setAlerts(prev => [...prev, {
        type: 'error',
        message: args.join(' '),
        timestamp: Date.now()
      }]);
    };
    
    // 模拟实时数据更新
    const interval = setInterval(() => {
      // 这里可以从WebSocket获取真实数据
      setMetrics(prev => ({
        ...prev,
        pageLoad: [...prev.pageLoad.slice(-10), {
          time: new Date().toLocaleTimeString(),
          value: Math.random() * 3000 + 1000 // 模拟加载时间
        }]
      }));
    }, 5000);
    
    return () => {
      console.log = originalConsole.log;
      console.error = originalConsole.error;
      clearInterval(interval);
    };
  }, []);
  
  // 计算性能评分
  const calculateScore = () => {
    const recentLoadTimes = metrics.pageLoad.slice(-5).map(m => m.value);
    const avgLoadTime = recentLoadTimes.reduce((a, b) => a + b, 0) / recentLoadTimes.length;
    
    if (avgLoadTime < 2000) return 'A';
    if (avgLoadTime < 3000) return 'B';
    if (avgLoadTime < 4000) return 'C';
    return 'D';
  };
  
  return (
    <div style={{
      position: 'fixed',
      bottom: '20px',
      right: '20px',
      background: 'white',
      border: '1px solid #ccc',
      padding: '15px',
      borderRadius: '8px',
      boxShadow: '0 2px 10px rgba(0,0,0,0.1)',
      zIndex: 9999,
      maxWidth: '400px',
      fontSize: '12px'
    }}>
      <h3 style={{ marginTop: 0 }}>🔍 性能监控面板 (开发环境)</h3>
      
      <div style={{ marginBottom: '15px' }}>
        <div>性能评分: <strong>{calculateScore()}</strong></div>
        <div>平均加载时间: {(metrics.pageLoad.slice(-5).reduce((a, b) => a + b.value, 0) / 5).toFixed(0)}ms</div>
        <div>API请求数: {metrics.apiRequests.length}</div>
        <div>错误数: {metrics.errors.length}</div>
      </div>
      
      {alerts.length > 0 && (
        <div style={{ 
          background: '#fff3cd', 
          padding: '10px', 
          borderRadius: '4px',
          marginBottom: '10px'
        }}>
          <strong>⚠️ 告警 ({alerts.length})</strong>
          {alerts.slice(-3).map((alert, i) => (
            <div key={i} style={{ marginTop: '5px', fontSize: '11px' }}>
              [{new Date(alert.timestamp).toLocaleTimeString()}] {alert.message}
            </div>
          ))}
        </div>
      )}
      
      <button 
        onClick={() => setAlerts([])}
        style={{
          background: '#007bff',
          color: 'white',
          border: 'none',
          padding: '5px 10px',
          borderRadius: '4px',
          cursor: 'pointer'
        }}
      >
        清空告警
      </button>
    </div>
  );
}

export default PerformanceDashboard;

2. 在应用中使用监控面板

// src/App.jsx
import React from 'react';
import ProductDetail from './components/ProductDetail';
import PerformanceDashboard from './components/PerformanceDashboard';

function App() {
  return (
    <div className="App">
      <header>
        <h1>电商网站</h1>
      </header>
      
      <main>
        <ProductDetail productId="123" />
        {/* 其他组件 */}
      </main>
      
      {/* 只在开发环境显示监控面板 */}
      {process.env.NODE_ENV !== 'production' && <PerformanceDashboard />}
    </div>
  );
}

export default App;

📈 第四步:后台数据处理(Node.js示例)

1. 简单的数据接收服务

// server/monitoring-server.js
const express = require('express');
const app = express();
const port = 3001;

app.use(express.json());

// 内存存储(生产环境用数据库)
const metricsDB = {
  pageLoads: [],
  apiRequests: [],
  errors: [],
  customEvents: []
};

// 接收监控数据
app.post('/api/collect', (req, res) => {
  const { metrics } = req.body;
  
  if (!Array.isArray(metrics)) {
    return res.status(400).json({ error: 'Invalid data format' });
  }
  
  // 分类存储指标
  metrics.forEach(metric => {
    switch (metric.type) {
      case 'page_load':
        metricsDB.pageLoads.push({
          ...metric.data,
          timestamp: metric.timestamp
        });
        break;
        
      case 'api_request':
        metricsDB.apiRequests.push({
          ...metric.data,
          timestamp: metric.timestamp
        });
        
        // API响应时间超过3秒告警
        if (metric.data.duration > 3000) {
          console.warn(`⚠️ API响应缓慢: ${metric.data.url} - ${metric.data.duration}ms`);
        }
        break;
        
      case 'custom_event':
        // 关键业务事件:加入购物车
        if (metric.data.name === 'add_to_cart') {
          console.log(`🛒 用户加入购物车: ${metric.data.productName}`);
        }
        // 结算流程开始
        if (metric.data.name === 'checkout_started') {
          console.log(`💰 用户开始结算: ¥${metric.data.totalAmount}`);
        }
        
        metricsDB.customEvents.push({
          ...metric.data,
          timestamp: metric.timestamp
        });
        break;
        
      case 'error':
        metricsDB.errors.push({
          ...metric.data,
          timestamp: metric.timestamp
        });
        
        // 错误告警
        console.error(`🚨 前端错误: ${metric.data.error}`);
        break;
    }
  });
  
  res.json({ success: true, received: metrics.length });
});

// 获取统计数据的API
app.get('/api/metrics/summary', (req, res) => {
  const oneHourAgo = Date.now() - 3600000;
  
  const recentPageLoads = metricsDB.pageLoads.filter(
    m => m.timestamp > oneHourAgo
  );
  
  const recentApiRequests = metricsDB.apiRequests.filter(
    m => m.timestamp > oneHourAgo
  );
  
  const recentErrors = metricsDB.errors.filter(
    m => m.timestamp > oneHourAgo
  );
  
  res.json({
    pageLoads: {
      total: recentPageLoads.length,
      average: recentPageLoads.reduce((sum, m) => sum + m.duration, 0) / recentPageLoads.length || 0,
      max: Math.max(...recentPageLoads.map(m => m.duration), 0)
    },
    apiRequests: {
      total: recentApiRequests.length,
      averageResponseTime: recentApiRequests.reduce((sum, m) => sum + m.duration, 0) / recentApiRequests.length || 0,
      successRate: recentApiRequests.filter(m => m.success).length / recentApiRequests.length * 100 || 0
    },
    errors: {
      total: recentErrors.length,
      recent: recentErrors.slice(-10)
    },
    businessMetrics: {
      addToCartCount: metricsDB.customEvents.filter(e => e.name === 'add_to_cart').length,
      checkoutStartCount: metricsDB.customEvents.filter(e => e.name === 'checkout_started').length
    }
  });
});

// 实时数据流(SSE)
app.get('/api/metrics/stream', (req, res) => {
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');
  
  // 每隔5秒发送最新数据
  const interval = setInterval(() => {
    const oneMinuteAgo = Date.now() - 60000;
    
    const recentMetrics = {
      pageLoads: metricsDB.pageLoads.filter(m => m.timestamp > oneMinuteAgo),
      apiRequests: metricsDB.apiRequests.filter(m => m.timestamp > oneMinuteAgo),
      errors: metricsDB.errors.filter(m => m.timestamp > oneMinuteAgo)
    };
    
    res.write(`data: ${JSON.stringify(recentMetrics)}\n\n`);
  }, 5000);
  
  req.on('close', () => {
    clearInterval(interval);
  });
});

app.listen(port, () => {
  console.log(`监控服务器运行在 http://localhost:${port}`);
  console.log(`数据接收接口: POST http://localhost:${port}/api/collect`);
  console.log(`数据查看接口: GET http://localhost:${port}/api/metrics/summary`);
});

2. 运行监控服务

# 启动监控服务器
node server/monitoring-server.js

# 前端配置监控端点
# 在.env文件中
REACT_APP_MONITORING_URL=http://localhost:3001/api/collect
REACT_APP_SAMPLE_RATE=0.1

🎯 第五步:关键业务监控场景

1. 转化率监控

// src/utils/conversionMonitor.js
class ConversionMonitor {
  constructor() {
    this.userJourney = {};
    this.startTime = Date.now();
  }
  
  // 用户行为追踪
  trackUserAction(action, data = {}) {
    const userId = this.getUserId();
    
    if (!this.userJourney[userId]) {
      this.userJourney[userId] = {
        startTime: Date.now(),
        actions: [],
        sessionId: this.generateSessionId()
      };
    }
    
    this.userJourney[userId].actions.push({
      action,
      timestamp: Date.now(),
      page: window.location.pathname,
      ...data
    });
    
    // 关键转化点检查
    this.checkConversion(userId, action, data);
  }
  
  checkConversion(userId, action, data) {
    const journey = this.userJourney[userId];
    const actions = journey.actions.map(a => a.action);
    
    // 转化路径: 浏览 -> 加购 -> 结算 -> 支付成功
    if (actions.includes('view_product') && 
        actions.includes('add_to_cart') && 
        actions.includes('start_checkout') &&
        action === 'payment_success') {
      
      // 计算转化时间
      const firstView = journey.actions.find(a => a.action === 'view_product');
      const conversionTime = Date.now() - firstView.timestamp;
      
      // 上报转化数据
      monitor.trackEvent('conversion_completed', {
        userId,
        sessionId: journey.sessionId,
        conversionTime,
        orderId: data.orderId,
        revenue: data.amount
      });
      
      console.log(`🎉 用户 ${userId} 完成转化,用时 ${conversionTime}ms`);
    }
  }
  
  getUserId() {
    // 从cookie或localStorage获取用户ID
    return localStorage.getItem('userId') || 'anonymous';
  }
  
  generateSessionId() {
    return 'session_' + Math.random().toString(36).substr(2, 9);
  }
}

// 使用示例
const conversionMonitor = new ConversionMonitor();

// 在用户操作时调用
function trackProductView(productId) {
  conversionMonitor.trackUserAction('view_product', { productId });
}

function trackAddToCart(productId) {
  conversionMonitor.trackUserAction('add_to_cart', { productId });
}

function trackPayment(orderId, amount) {
  conversionMonitor.trackUserAction('payment_success', { orderId, amount });
}

2. 性能预算告警

// src/utils/performanceBudget.js
class PerformanceBudget {
  constructor(budgets) {
    this.budgets = {
      LCP: 2500,    // 最大内容绘制 < 2.5秒
      FID: 100,     // 首次输入延迟 < 100ms
      CLS: 0.1,     // 累积布局偏移 < 0.1
      API: 2000,    // API响应时间 < 2秒
      ...budgets
    };
    
    this.violations = [];
  }
  
  check(metricName, value, context = {}) {
    const budget = this.budgets[metricName];
    
    if (budget && value > budget) {
      const violation = {
        metric: metricName,
        value,
        budget,
        exceededBy: ((value - budget) / budget * 100).toFixed(1) + '%',
        timestamp: Date.now(),
        ...context
      };
      
      this.violations.push(violation);
      
      // 触发告警
      this.triggerAlert(violation);
      
      return false; // 超出预算
    }
    
    return true; // 符合预算
  }
  
  triggerAlert(violation) {
    // 控制台告警
    console.warn(
      `🚨 性能预算超支: ${violation.metric} = ${violation.value}ms ` +
      `(预算: ${violation.budget}ms, 超出: ${violation.exceededBy})`
    );
    
    // 发送到监控系统
    monitor.sendMetric('performance_budget_violation', violation);
    
    // 严重超支时发送邮件/钉钉告警
    if (violation.value > violation.budget * 1.5) {
      this.sendCriticalAlert(violation);
    }
  }
  
  sendCriticalAlert(violation) {
    // 实际项目中这里集成邮件/钉钉/企业微信
    console.error('🔴 严重性能问题需要立即处理:', violation);
  }
  
  getReport() {
    const recentViolations = this.violations.filter(
      v => Date.now() - v.timestamp < 3600000 // 最近1小时
    );
    
    return {
      totalViolations: this.violations.length,
      recentViolations: recentViolations.length,
      worstOffender: recentViolations.reduce((worst, current) => 
        (current.value - current.budget) > (worst.value - worst.budget) ? current : worst
      ),
      complianceRate: 1 - (recentViolations.length / (recentViolations.length + 100)) // 简化计算
    };
  }
}

// 使用示例
const budget = new PerformanceBudget();

// 在性能数据收集时检查
function reportLCP(value) {
  if (!budget.check('LCP', value, { page: window.location.href })) {
    // 超出预算,执行降级策略
    implementFallbackStrategy();
  }
}

function reportAPITime(url, duration) {
  if (!budget.check('API', duration, { url })) {
    // API响应慢,显示加载状态或缓存
    showLoadingState();
  }
}

📋 第六步:实际项目部署清单

1. 快速启动清单

## 第一天:基础监控
- [ ] 安装监控SDK到项目
- [ ] 配置监控服务器地址
- [ ] 启用页面加载监控
- [ ] 启用错误监控
- [ ] 查看控制台是否有数据

## 第一周:核心业务监控  
- [ ] 监控关键按钮点击(加购、下单)
- [ ] 监控核心API接口性能
- [ ] 设置性能预算告警
- [ ] 搭建简单数据看板

## 第一个月:深度优化
- [ ] 用户转化路径分析
- [ ] 慢页面/慢API分析
- [ ] 建立性能评分体系
- [ ] 自动化告警通知

## 长期维护
- [ ] 定期查看性能报告
- [ ] 根据数据优化代码
- [ ] 更新性能预算阈值
- [ ] 团队分享性能指标

2. 实际项目配置示例

// .env文件配置
REACT_APP_MONITORING_URL=https://monitor.yourcompany.com/api/collect
REACT_APP_SAMPLE_RATE=0.2
REACT_APP_ENABLE_PERFORMANCE_DASHBOARD=true
REACT_APP_PERFORMANCE_BUDGET_LCP=2500
REACT_APP_PERFORMANCE_BUDGET_API=2000

// package.json脚本
{
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "monitor:dev": "node server/monitoring-server.js",
    "monitor:prod": "NODE_ENV=production node server/monitoring-server.js",
    "analyze-perf": "webpack-bundle-analyzer build/stats.json"
  }
}

🎯 总结:如何开始

立即行动:

  1. 复制上面的monitoring.js到你的项目
  2. 在入口文件引入监控SDK
  3. 启动本地监控服务(或使用现有后端)
  4. 在关键业务组件添加埋点
  5. 打开控制台查看监控数据

重点关注:

  • 页面加载时间:用户第一印象
  • 核心业务操作:加购、下单成功率
  • API响应时间:直接影响用户体验
  • 错误率:及时发现线上问题
  • 转化率:业务核心指标

不要过度:

  • ❌ 不要监控所有点击
  • ❌ 不要100%采样(影响性能)
  • ❌ 不要在监控上花太多时间初期
  • ❌ 不要只看平均值,关注P95/P99

从监控页面加载时间开始,逐步增加监控项。先有数据,再优化。性能监控的价值在于用数据驱动优化决策,而不是收集数据本身。

posted @ 2025-12-22 14:17  XiaoZhengTou  阅读(17)  评论(0)    收藏  举报