Q14 · 监控与调试

如何监控一个接口的返回时间与是否出错?

接口监控fetchaxios

⚡ 速记答案(30 秒)

  • 前端拦截请求层fetch / XMLHttpRequest 封装,记录开始时间和结束时间
  • 根据响应状态码、业务 code 判断成功/失败
  • 上报:接口名、耗时、状态码、错误信息、用户环境
  • 后端:接入日志系统(ELK 等),统计每个 API 的耗时/错误率
  • 最终在监控平台做:告警 + 看板(耗时分布、错误率趋势)

📖 详细讲解

监控维度


1. 时间指标

• 请求耗时

• TTFB(首字节时间)

• 下载时间


2. 状态指标

• HTTP 状态码

• 业务状态码

• 成功率/错误率


3. 上下文信息

• 接口 URL

• 请求参数(脱敏)

• 用户信息

• 设备/网络环境


实现方式


1. Fetch 拦截

重写 window.fetch


2. Axios 拦截器

使用 request/response 拦截器


3. XHR 代理

重写 XMLHttpRequest.prototype

💻 代码示例

Axios 接口监控
import axios from 'axios';

const api = axios.create({
  baseURL: '/api',
  timeout: 10000,
});

// 请求拦截器 - 记录开始时间
api.interceptors.request.use((config) => {
  config.metadata = { startTime: Date.now() };
  return config;
});

// 响应拦截器 - 计算耗时并上报
api.interceptors.response.use(
  (response) => {
    const duration = Date.now() - response.config.metadata.startTime;
    
    reportApiMetrics({
      url: response.config.url,
      method: response.config.method,
      status: response.status,
      duration,
      success: true,
    });
    
    return response;
  },
  (error) => {
    const config = error.config;
    const duration = config ? Date.now() - config.metadata.startTime : 0;
    
    reportApiMetrics({
      url: config?.url,
      method: config?.method,
      status: error.response?.status || 0,
      duration,
      success: false,
      errorMessage: error.message,
    });
    
    return Promise.reject(error);
  }
);

function reportApiMetrics(data: any) {
  navigator.sendBeacon('/api/monitor/api', JSON.stringify(data));
}
💡
面试技巧:回答性能问题时,先说指标和标准,再讲优化手段,最后结合实际项目经验。